有没有给定两个节点找到其一组节点(具有定义的关系)的有效方法。使用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]
。
有没有给定两个节点找到其一组节点(具有定义的关系)的有效方法。使用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]
。
在很多情况下,可以利用域的结构来提高性能。假设您知道一般情况下您的A
实体与B
实体上的y
关系的数量相比具有较少的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;
}
}
}
另一种方法是启动两个线程从任一侧扫描关系。
第三种方法是创建一个专门的索引来帮助回答这种查询,这显然会影响插入性能。
在小鬼(http://gremlin.tinkerpop.com),这表现为这样:
setA._().out('x').in('y').retain(setB).back(2)
以下是每一步操作:在组A
田田!
祝你好运, Marko。
我想从GremlinePipeline对象获取的顶点,你能告诉我如何在Java API来实现这一目标。下面是我使用的代码:GremlinPipeline pipeline = new GremlinPipeline(vert).out(“LIVES_IN_CITY”)。in(“LIVES_IN_CITY”)。filter(new PipeFunction(){public Boolean compute(Vertex v){return v。 getProperty(“name”)。equals(city);}})。back(2).out(“LIVES_IN_CITY”); – RCS 2015-03-09 09:51:41