Есть ли эффективный путь с, учитывая два узла для нахождения ряда их общих узлов (с определенными отношениями).
Например, наличие узлов 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]
.
Во многих случаях структура домена может использоваться для повышения производительности. Допустим, вы знаете, что в целом ваши объекты 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;
}
}
}
Другой способ - запустить два потока, которые просматривают отношения с обеих сторон.
Третий подход заключается в создании специализированного индекса, который поможет отвечать на такие запросы, что, очевидно, снизит производительность вставки.