是否可以将TraversalDescription配置为接收路径集合,这些路径没有一对路径,一条路径是另一条路径(尤其是前缀)?
答案 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
修改评估者方法并改变遍历顺序(例如改为深度优先的后序遍历)将允许更复杂的行为,这些行为可能对您有用,也可能没有用。