Эффективный способ найти набор узлов, имеющий отношения к данным узлам с помощью neo4j

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

Например, наличие узлов 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].

5
задан Jonas 2 June 2010 в 08:21
поделиться

1 ответ

Во многих случаях структура домена может использоваться для повышения производительности. Допустим, вы знаете, что в целом ваши объекты 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;
        }
    }
}

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

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

5
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: