TraversalDescription中没有包含彼此的路径

时间:2013-12-23 15:41:11

标签: neo4j traversal

是否可以将TraversalDescription配置为接收路径集合,这些路径没有一对路径,一条路径是另一条路径(尤其是前缀)?

1 个答案:

答案 0 :(得分:2)

使用评估员。

给出一个示例图:

A->B->C

A(在此示例中为反向)从没有求值程序的C遍历将返回三个路径:

{C, B->C, A->B->C}

假设我对遍历图表的输入感兴趣(在这种情况下,'A')。如果路径中的最后一个节点是输入,我可以通过终止和返回路径来完成此操作。我创建了一个Evaluator对象(如下所示):

public class TerminalEvaluator implements Evaluator {

    @Override
    public Evaluation evaluate(Path path) {
        if (path.endNode().hasRelationship(Direction.INCOMING)) {
            return Evaluation.EXCLUDE_AND_CONTINUE;
        }
        return Evaluation.INCLUDE_AND_CONTINUE;
    }
}

这将检查路径的结束节点是否为输入(即,没有传入的关系/边缘)。如果它不是输入,则从遍历返回的集合中排除该路径,并继续返回Evaluation.EXCLUDE_AND_CONTINUE。如果节点是输入,则它包括返回的集合中的路径(使用Evaluation.INCLUDE_AND_CONTINUE)。

你需要设置评估器 - 在我的玩具示例中,给定一个名为'graphDb'的GraphDatabaseService(我已经排除了反向驱动此遍历的代码):

graphDb.traversalDescription().depthFirst().evaluator(new TerminalEvaluator())

运行此遍历将返回一个路径:

A->B->C

修改评估者方法并改变遍历顺序(例如改为深度优先的后序遍历)将允许更复杂的行为,这些行为可能对您有用,也可能没有用。