【问题标题】:Neo4j: Step back in traversalNeo4j:在遍历中退一步
【发布时间】:2012-10-19 17:40:53
【问题描述】:

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

因此,我将描述一个 TraversalDescription,它检查其 Evaluator 中的路径长度并在步骤 1 中选择 KNOWS 关系。如果有一个,我(自动)转到路径中连接的 KNOWS 节点,然后会有退一步到传出节点。因此,如果当前遍历的节点具有 path-startnode 的 id,我将只检查何时 path.length == 2 获取传入的 KNOWS-relation 并将 continue-variable 设置为 true。

问题:我再也没有回到路径起始节点(我检查了 KNOWS 关系的那个),它从未出现在评估器中;我还尝试使用不同的 UNIQUENESS 参数,但都没有成功。

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

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);
        }

【问题讨论】:

    标签: java neo4j traversal


    【解决方案1】:

    试试

    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);
        }
    

    你的伪代码:

    • 表示不应包含任何路径 - 字段 include 每次都是 false
    • 语句的第二部分不是比较 (==),而是一个赋值 (=)

    【讨论】:

    • 是的,感谢您的评论。如上所述:这只是伪代码,所以不要介意包含字段总是错误的。将修复示例中的比较分配。当我有机会测试你的遍历时会回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多