0

让我们假设一个非常简单的示例图,其中包含人(作为节点)以及两者之间的 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 参数,但没有一个起作用。

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

1 回答 1

0

尝试

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

你的伪代码:

  • 说不应该包含任何路径 - 字段包含每次都是错误的
  • 你的语句的第二部分是没有比较(==),它是一个赋值(=)
于 2012-10-30T13:31:45.670 回答