5

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

例如,有节点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]

4

2 回答 2

8

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

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

以下是每个步骤的作用:

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

多田!

祝你好运,马尔科。

http://markorodriguez.com

于 2012-01-25T22:06:40.533 回答
5

在许多情况下,可以利用域的结构来提高性能。假设您知道,与实体上的关系数量相比,您的实体通常具有较少的A关系。然后你可以从A节点开始遍历两步,看看节点出现在哪里,这样就可以过滤掉节点。这是这种方法的一些代码:xyBBC

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;
        }
    }
}

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

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

于 2010-06-02T14:07:14.507 回答