给定两个节点是否有一种有效的方法来找到一组它们的公共节点(具有定义的关系)。
例如,有节点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]
。
在 Gremlin ( http://gremlin.tinkerpop.com ) 中,这表示如下:
setA._().out('x').in('y').retain(setB).back(2)
以下是每个步骤的作用:
多田!
祝你好运,马尔科。
在许多情况下,可以利用域的结构来提高性能。假设您知道,与实体上的关系数量相比,您的实体通常具有较少的A
关系。然后你可以从A节点开始遍历两步,看看节点出现在哪里,这样就可以过滤掉节点。这是这种方法的一些代码:x
y
B
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;
}
}
}
另一种方法是启动两个线程,从任一侧扫描关系。
第三种方法是创建一个专门的索引来帮助回答这种查询,这显然会损害插入性能。