Эффективный способ найти множество узлов, имеющих отношение к заданным узлам, используя neo4j - PullRequest
5 голосов
/ 02 июня 2010

Существует ли эффективный способ с указанными двумя узлами найти набор их общих узлов (с определенными отношениями).

Например, имея узлы A1, B1, C1 - C4, связанные отношениями x и y:

A1 --x--> C1
A1 --x--> C2
A1 --x--> C3
B1 --y--> C2
B1 --y--> C3
B1 --y--> C4

общий узел, установленный для A1(x) и B1(y), будет [C2, C3].

Ответы [ 2 ]

8 голосов
/ 26 января 2012

В Гремлин (http://gremlin.tinkerpop.com), это выражается так:

setA._().out('x').in('y').retain(setB).back(2)

Вот что делает каждый шаг:

  1. начать с setA (A1, A2, A3 в вашем примере).
  2. запустить трубопровод Гремлин.
  3. взять исходящие помеченные "x" ребра из этих вершин setA в C1, C2 и C3.
  4. взять входящие помеченные буквой "y" ребра из C1, C2 и C3.
  5. отфильтровывает все шаги, которые не входят в setB (таким образом, существуют только пути C2 и C3).
  6. вернитесь к тому, что вы видели 2 шага назад - таким образом, C2 и C3.

Тад!

Удачи, Марко.

http://markorodriguez.com

5 голосов
/ 02 июня 2010

Во многих случаях структура домена может быть использована для повышения производительности. Допустим, вы знаете, что в целом ваши A сущности имеют меньше отношений x по сравнению с числом y связей на B сущностях. Затем вы можете пройти два шага от узла A и посмотреть, где появляется узел B, и таким образом отфильтровать узлы C. Вот некоторый код для этого подхода:

Set<Node> found = new HashSet<Node>();
for ( Relationship firstRel : a1.getRelationships( Reltypes.x, Direction.OUTGOING ) )
{
    Node cNode = firstRel.getEndNode();
    for ( Relationship secondRel : cNode.getRelationships( Reltypes.y, Direction.INCOMING ) )
    {
        Node bNode = secondRel.getStartNode();
        if ( bNode.equals( b1 ) )
        {
            found.add( cNode );
            break;
        }
    }
}

Другим способом было бы запустить два потока, которые сканируют отношения с любой стороны.

Третий подход заключается в создании специализированного индекса, который помог бы отвечать на запросы такого типа, что, очевидно, снизило бы производительность вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...