2015-02-06 135 views
1

我想遍历一个图并返回链接2个节点的所有路径,其中第一个关系是传出,第二个传入。例如,如果关系是投票,我想看到从节点25到节点86的所有可能的路径,我有MATCH p=((n {id:"25"}) -[*1..2]-> (m {id:"86"})) RETURN p;然后,我想检查是否在返回的路径中,我有同样类型的属性在传出和传入关系(如果他们拥有相同的投票)。
我尝试在java中使用图遍历api来完成该操作,但是我返回的是单个路径如何获取所有可能的路径以检查它们?neo4j java遍历返回多个路径而不是一个

{它基本上是与所有普通的邻居问题检查关系}

int common = 0; 
    int diff = 0; 
    for (Path position : graphDb.traversalDescription() 
      .relationships(Wikilections_user.RelTypes.Voted, Direction.OUTGOING) 
      .relationships(Wikilections_user.RelTypes.Voted, Direction.INCOMING) 
      // .evaluator(Evaluators.fromDepth(1)) 
      .evaluator(Evaluators.toDepth(2)) 
      .evaluator(Evaluators.includeWhereEndNodeIs(node2)) 
      // .evaluator(Evaluators.excludeStartPosition()) 
      .traverse(node1)) 
      { 
     Iterable<Relationship> myRels = position.reverseRelationships(); 

     for (Relationship temp : myRels) { 
      System.out.println((temp.getStartNode()).getProperty("id") + " with " + temp.getProperty("with") + " :" + (temp.getEndNode()).getProperty("id")); 
     } 
      String with = ""; 
        int i = 0; 

     for (Relationship temp : myRels) { 
         if (i == 0) { 
          with = (String) temp.getProperty("with"); 
          i++; 
         } 
         if (i == 1) { 
          if (((String) temp.getProperty("with")).equals(with)) { 
           common++; 
          } else { 
           diff++; 
          } 
         } 
        } 
    } 
    return (double) common * 100/(common + diff); 

回答

2

遍历有uniqueness rules。阅读该链接,它会介绍遍历器的工作原理以及如何配置它。默认情况下,唯一性规则设置为NODE_GLOBAL,这意味着某个节点不能被遍历多次。

我怀疑这可能是你的问题;如果您正在查找一个目标节点,但您希望指向该节点的所有路径,则应该使用RELATIONSHIP_GLOBAL,或者使用文档中列出的其他选项之一。您的遍历器正在查找一个末端节点,并且默认情况下您只能遍历该节点一次。

所以要尝试此修复程序,添加不同的独特性,以你的遍历描述:

graphDb.traversalDescription() 
    .relationships(Wikilections_user.RelTypes.Voted, Direction.OUTGOING) 
    .relationships(Wikilections_user.RelTypes.Voted, Direction.INCOMING) 
    .uniqueness(Uniqueness.RELATIONSHIP_GLOBAL); 
+0

你是对我真正需要的关系的独特性.uniqueness(Uniqueness.RELATIONSHIP_PATH),但我怎么能做出一定第一个获得传出,然后传入而不是2个传出或2个传入或传出? – anu 2015-02-09 11:13:30

+0

我的意思是我如何使用 遍历(Traverser.Order traversalOrder,StopEvaluator stopEvaluator,ReturnableEvaluator returnableEvaluator,RelationshipType firstRelationshipType,Direction firstDirection,RelationshipType secondRelationshipType,Direction secondDirection) 为了得到我想要的这个例子 – anu 2015-02-09 11:44:39

相关问题