2010-06-02 146 views

回答

4

在很多情况下,可以利用域的结构来提高性能。假设您知道一般情况下您的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; 
     } 
    } 
} 

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

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

8

在小鬼(http://gremlin.tinkerpop.com),这表现为这样:

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

以下是每一步操作:在组A

  1. 开始(A1,A2,A3在你的例子)。
  2. 启动Gremlin流水线。
  3. 将从这些setA顶点出发的“x”标记边缘取为C1,C2和C3。
  4. 将来自C1,C2和C3的传入“y”标记边缘。
  5. 过滤掉所有不在setB中的步骤(因此,只有C2和C3路径存在)。
  6. 回到你看到2步前 - 因此,C2和C3。

田田!

祝你好运, Marko。

http://markorodriguez.com

+0

我想从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

相关问题