Thanks!

Based on your starting point, this query seems to work:

select from (
  select expand(in('D') ) from A where aField = 'a123'
) where @class = 'B' and out('D') contains ( @class = 'C' and cField = 
'c456' )


On Friday, January 24, 2014 3:47:25 PM UTC-7, Lvc@ wrote:
>
> Hi,
> you could start with something like:
>
> select from (
>   select expand( in('D') ) from A where aField = 'a456'
> ) where in('D') contains ( cField = 'c123' )
>
> The idea is: you start from A sub set and get all the incoming B vertices 
> (connected as IN with edge 'D'). Then you filter only the instances that 
> have incoming C vertices that are in the other subset.
>
> Let me know if works.
> Lvc@
>
>
>
> On 24 January 2014 23:38, Nick Bauer <[email protected] <javascript:>>wrote:
>
>> The graph looks like this:
>>
>> A <--- B ---> C
>>
>> Basically, I want to start with a subset of A vertices and a subset of C 
>> vertices, and I want to get back the subset of B vertices that is linked to 
>> at least 1 vertex in each of the starting subsets.
>>
>> I actually just tried combining the two queries above, which seems to 
>> work a lot better:
>> select * from (
>>     traverse out from (
>>         traverse in_D from (
>>             select * from A where aField = 'a456'
>>         )
>>     )
>> )
>> where @class = 'B' and (
>>     out_D traverse(0,1) (
>>         @class = 'C' and cField = 'c123'
>>     )
>> )
>>
>> Is there a better way to query for those B vertices?
>>
>> Thanks!
>>
>>
>> On Friday, January 24, 2014 3:03:25 PM UTC-7, Lvc@ wrote:
>>
>>> Hi Nick,
>>> can you explain your domain in terms of a graph? Like:
>>>
>>> A ---> B <---- C
>>>
>>> And where you start and what you want to get back?
>>>
>>> Lvc@
>>>
>>>
>>>
>>> On 24 January 2014 22:00, Nick Bauer <[email protected]> wrote:
>>>
>>>> We are using OrientDB 1.6.4.
>>>>
>>>> We have a graph with 3 classes of vertices: A, B, and C
>>>> Class A has a medium multiplicity (tens of thousands of vertices)
>>>> Class B has a high multiplicity (hundreds of thousands of vertices)
>>>> Class C has a low multiplicity (a few vertices)
>>>>
>>>> We have also defined an edge class, D, which is used to link vertices 
>>>> of all three classes.
>>>>
>>>> Every instance of class B is linked to at least one instance of A and 
>>>> at least one instance of C.  Also, the links from the B instances are 
>>>> fairly evenly distributed among all of the A instances and among all of 
>>>> the 
>>>> C instances.
>>>>
>>>> Thus, there are a relatively small number of B instances linked to any 
>>>> single A instance.  There are a much higher number of B instances linked 
>>>> to 
>>>> any single C instance.
>>>>
>>>> We want to find all instances of class B that are linked to at least 
>>>> one A instance that has a certain field value and that are also linked to 
>>>> at least one instance of C that has a certain field value.
>>>>
>>>>
>>>> We can solve half of the problem with a query like this, which 
>>>> traverses from the A instances that match the condition, and finds all of 
>>>> the B instances linked to them:
>>>> select * from (traverse out from (traverse in_D from (select * from A 
>>>> where aField = 'a456') )) where @class = 'B'
>>>>
>>>> This query quickly returns a relatively small number of B instances to 
>>>> work with, so it seems beneficial to start there.  However, 
>>>> from there, we can continue to traverse out to the C instances linked 
>>>> to those B instances, but it seems like if we do that, we lose the ability 
>>>> to further filter out those B instances based on the C instances they link 
>>>> to.
>>>>
>>>> Is there a way to filter the B instances based on the C instances they 
>>>> link to, without traversing to the C instances themselves?
>>>>
>>>> We have also found that this query works, but given the high 
>>>> multiplicity of class B, it seems to take a very long time (around 10 
>>>> minutes) to run:
>>>> select from B where ((out_D traverse(0,1) (@class = 'C' and cField = 
>>>> 'c123')) and (out_D traverse(0,1) (@class = 'A' and aField = 'a456')))
>>>>
>>>> Is there a better way to query for vertices based on their links to 
>>>> multiple collections of vertices?
>>>>
>>>> -- 
>>>>  
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "OrientDB" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>>
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>
>>>  -- 
>>  
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "OrientDB" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to