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