有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

对于给定的两个节点,是否有一种有效的方法来找到它们的一组公共节点(具有定义的关系)

例如,让节点A1B1C1-C4与关系xy连接:

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) 个答案

  1. # 1 楼答案

    在Gremlin(http://gremlin.tinkerpop.com)中,这表示为:

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

    以下是每个步骤的作用:

    1. 从setA开始(在你的例子中是A1、A2、A3)
    2. 启动一个小精灵管道
    3. 从这些setA顶点到C1、C2和C3,取标有“x”的边
    4. 从C1、C2和C3中获取带“y”标记的传入边
    5. 过滤掉所有不在setB中的步骤(因此,只有C2和C3路径存在)
    6. 回到你2步前看到的,C2和C3

    塔达

    祝你好运, 马尔科

    http://markorodriguez.com

  2. # 2 楼答案

    在许多情况下,可以利用域的结构来提高性能。假设您知道,与B实体上的y关系的数量相比,通常A实体的x关系更少。然后,您可以从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;
            }
        }
    }
    

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

    第三种方法是创建一个专门的索引来帮助回答这类查询,这显然会影响insert的性能