Search code examples
sqlfilteringserver-sideorientdb

OrientDB - filter selected vertices by other vertices connected to them


I'm not an OrientDB profi, so maybe my question will sound dumb; but I didn't find any answers in docs or on the Net.

This is a sample of a data structure that I have: I want to find all of the beavers, that have blue eyes, and they're happy and they know it.

I do manage to select the eye color and the happiness state with out() function - something like

SELECT out('has').eyeColors, out('is').happinessState FROM beavers

But how do I filter by those connected vertices? I've tried

SELECT * FROM beavers WHERE out('has').eyeColors = 'blue' AND out('is').happinessState = 'happy and knows it'

and

SELECT * FROM beavers WHERE (SELECT out('has').eyeColors FROM beavers) = 'blue' AND (SELECT out('is').happinessState FROM beavers) = 'happy and knows it'

but both of the query types tend to return empty results.

So - how can I achieve such a selection?

*I run Community Edition, v. 2.1.11, and do all of this in server-side JS function.

Thanks, Gregory


Solution

  • in the WHERE condition you need to use the CONTAINS word because the out() - so for in() and both() - returns a list.

    eg

    select from Beaver where out('has').eyeColors contains "Blue" and out("iss").happinessState contains "happy and knows it"
    

    You can verify whether it returns a list or not by selecting it:

    select out('has').eyeColors from Beaver
    

    PS

    I see that you're using an edge class called is that, I think, it's not allowed since it is a private word.


    Hope it helps. Ivan


    UPDATE

    select name from Children
    let $a=(select from Beaver where in('has').@rid contains $parent.$current.@rid and out('has').eyeColor contains "Blue" and out("iss").happinessState contains "happy and knows it")
    where $a.size() > 0