Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两种不同关系的Neo4J遍历顺序是否正确?_Neo4j - Fatal编程技术网

两种不同关系的Neo4J遍历顺序是否正确?

两种不同关系的Neo4J遍历顺序是否正确?,neo4j,Neo4j,我正在使用Neo4J Traversal API并尝试从“1”进行遍历,以找到符合以下模式的节点“2”和“3”: 1-[:A]-2-[:B]-3 然而,在我的遍历过程中,我被发现了,因为以下关系也存在: 1-[:B]-3 据我所知,我的遍历描述需要指定这两种关系类型,但我不确定首先遍历:A关系,然后再分支到:B关系的最优雅方式。不幸的是,在我的例子中,方向的关系不能用来区分 我的Scala代码是: db.traversalDescription() .evaluator(isAThe

我正在使用Neo4J Traversal API并尝试从“1”进行遍历,以找到符合以下模式的节点“2”和“3”:

1-[:A]-2-[:B]-3
然而,在我的遍历过程中,我被发现了,因为以下关系也存在:

1-[:B]-3
据我所知,我的
遍历描述
需要指定这两种关系类型,但我不确定首先遍历:A关系,然后再分支到:B关系的最优雅方式。不幸的是,在我的例子中,
方向
的关系不能用来区分

我的Scala代码是:

db.traversalDescription()
    .evaluator(isAThenBRelationship)
    .breadthFirst()
    .relationships(A)
    .relationships(B)

private val isAThenBRelationship = new PathEvaluator.Adapter() {
override def evaluate(path: Path, state: BranchState[Nothing]): Evaluation = {
  if (path.length == 0) {
    EXCLUDE_AND_CONTINUE
  } else if (path.length == 1) {
    Evaluation.of(false, path.relationships().iterator().next().getType.name() == A.toString)
  } else {
    Evaluation.of(path.relationships().iterator().next().getType.name() == B.toString, false)
  }
}
}

顺便说一句,还有什么比这更好的比较关系的方法呢

path.relationships().iterator().next().getType.name() == MyRelationship.toString
多次使用
relationships()
并不意味着订单。相反,有一个内部列表,
relationships()
向其中添加了一些内容

要将特定关系类型限制在特定深度,您需要实现并使用自己的
PathExpander
。下面的示例使用Java并使用匿名内部类实现了
PathExpander

traversalDescription.expand(new PathExpander<Object>() {
    @Override
    public Iterable<Relationship> expand(Path path, BranchState<Object> state) {
        switch (path.length()) {
            case 0:
                return path.endNode().getRelationships(
                    DynamicRelationshipType.withName("A") );
            case 1:
                return path.endNode().getRelationships(
                    DynamicRelationshipType.withName("B") );
            default:
                return Iterables.empty();
        }
    }

    @Override
    public PathExpander<Object> reverse() {
        // not used for unidirectional traversals
        throw new UnsupportedOperationException();
    }
});

除了@StefanArmburster的答案之外,这里还有等效的Scala代码:

db.traversalDescription()
.breadthFirst()
.扩展(即扩展关系)
private val Isatenbrelationship=
新的路径扩展器[对象](){
覆盖def expand(路径:路径,状态:BranchState[对象])=
path.length()匹配{
案例0=>path.endNode().getRelationships(DynamicRelationshipType.withName(“A”))
案例1=>path.endNode().getRelationships(DynamicRelationshipType.withName(“B”))
case=>Iterables.empty()
}
覆盖def reverse():路径扩展器[对象]=???
}

请注意,扩展器必须位于关系之后。

您可以省略对
relationships()
方法的调用。@StefanArmburster谢谢。我已经更新了我的答案。请继续发表有用的评论-我渴望改进我的Neo&Scala。在大多数情况下,TraversalDescription需要一个评估器来决定某条路径是否是结果集的一部分。我不确定如果忽略指定求值器会发生什么,要么得到所有遍历的路径,要么没有。
 IteratorUtil.first(path.relationships()).getType().equals(MyRelationship)