使用neo4j找到与给定节点有关系的节点集的有效方法

Jon*_*nas 5 java graph set neo4j

给定两个节点是否有一种有效的方法来查找一组公共节点(具有已定义的关系).

例如,具有节点A1,B1,C1- C4与关系进行连接xy:

A1 --x--> C1
A1 --x--> C2
A1 --x--> C3
B1 --y--> C2
B1 --y--> C3
B1 --y--> C4
Run Code Online (Sandbox Code Playgroud)

A1(x)B1(y)将要设置的公共节点[C2, C3].

Mar*_*uez 8

在Gremlin(http://gremlin.tinkerpop.com)中,这表达如下:

setA._().out('x').in('y').retain(setB).back(2)
Run Code Online (Sandbox Code Playgroud)

以下是每个步骤的作用:

  1. 从setA开始(在您的示例中为A1,A2,A3).
  2. 启动Gremlin管道.
  3. 将那些setA顶点的输出"x"标记边缘取为C1,C2和C3.
  4. 从C1,C2和C3中取出传入的"y"标记边.
  5. 过滤掉不在setB中的所有步骤(因此,只存在C2和C3路径).
  6. 回到你之前看到的2步 - 因此,C2和C3.

田田!

祝你好运,马可.

http://markorodriguez.com


naw*_*oth 5

在许多情况下,可以利用域的结构来提高性能。比方说,你知道,在一般的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是启动两个线程来从任一侧扫描关系。

第三种方法是创建一个专门的索引,以帮助回答此类查询,这显然会损害插入性能。