繁体   English   中英

Neo4j:后退遍历

[英]Neo4j: Step back in traversal

让我们假设一个非常简单的示例人物图(作为节点)以及它们之间的KNOWS-和FRIEND_OF-关系。 现在,我想让每个节点都知道一个随机的人并且是FRIEND_OF(这个或另一个)人。 请考虑一下,我想使用遍历来检查这些关系,而不是简单的node.hasRelationship()。

因此,我将描述一个TraversalDescription,它检查其评估器中的路径长度并在步骤1中选择KNOWS关系。如果有一个I(自动),请转到路径中连接的KNOWS节点,然后必须创建一个返回到传出节点。 因此,我只检查传入的KNOWS关系的path.length == 2时,如果当前遍历的节点具有path-startnode的id,则将continue-variable设置为true。

问题是:我再也没有回到path-startnode(我检查过KNOWS关系的那个),它永远不会出现在评估器中。 我也尝试使用不同的UNIQUENESS参数,但是没有一个起作用。

/ edit:这是我的遍历描述(伪代码或多或少):

TraversalDescription td = Traversal.description()
    .relationships(RelTypes.KNOWS, Direction.BOTH)
    .relationships(RelTypes.FRIEND_OF, Direction.OUTGOING)
    .uniqueness(Uniqueness.NONE)
    .evaluate(new Evaluator(){
        public Object evaluate(final Path path){
            if (path.length == 0) return EXCLUDE_CONTINUE;
            Relation currentRel = path.lastRelationship();
            boolean continue = false;
            boolean include = false;
            if (path.length == 1){
                // check for outgoing knows-relation
                continue = currentRel.isType(KNOWS) && currentRel.startNode().getId == path.startNode().getId();
            }
            else if (path.length == 2){
                // check for outgoing knows-relation to the original start node
                // SECOND PART OF STATEMENT NEVER GETS TRUE!
                toContinue = currentRel.isType(KNOWS) && currentRel.startNode().getId == path.startNode().getId();
            }
            else if (path.length == 3){
                // ...
            }
            return Evaluation.of(toContinue, include);
        }

尝试

private static Traverser getHomies(final Node ofPerson) {
        TraversalDescription td = Traversal.description().breadthFirst().relationships(RelTypes.KNOWS, Direction.INCOMING)
                .relationships(RelTypes.FRIEND_OF, Direction.OUTGOING).evaluator(Evaluators.includingDepths(1, 2))
                .evaluator(Evaluators.returnWhereLastRelationshipTypeIs(RelTypes.FRIEND_OF));

        return td.traverse(ofPerson);
    }

您的伪代码:

  • 说,没有路径应包括-场包括为每次
  • 您语句的第二部分是无比较(==),它是赋值(=)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM