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.