Java Neo4j遍历路径计算器BranchState设置为null
我正在尝试使用TraversalDescription遍历一个图形。出于我的目的,有必要使用定制的evalute(Path,BranchState)方法实现来实现PathEvaluator。我通过创建一个名为CustomPathEvaluator的新类来实现PathEvaluator 我的问题是,当我在遍历中初始化BranchState并为其设置状态时,我无法在下一个子级恢复状态。这意味着BranchState设置为null。 下面是我的简化代码:Java Neo4j遍历路径计算器BranchState设置为null,java,graph,neo4j,traversal,graph-databases,Java,Graph,Neo4j,Traversal,Graph Databases,我正在尝试使用TraversalDescription遍历一个图形。出于我的目的,有必要使用定制的evalute(Path,BranchState)方法实现来实现PathEvaluator。我通过创建一个名为CustomPathEvaluator的新类来实现PathEvaluator 我的问题是,当我在遍历中初始化BranchState并为其设置状态时,我无法在下一个子级恢复状态。这意味着BranchState设置为null。 下面是我的简化代码: public class CustomPath
public class CustomPathEvaluator implements PathEvaluator<StateInfo> {
private Node endNode;
public Evaluation evaluate(Path path, BranchState<StateInfo> branchState) {
Node node = path.endNode();
if(path.length() == 0) {
StateInfo stateInfo = new StateInfo();
stateInfo.label = 2;
InitialBranchState.State<StateInfo> si
= new State<StateInfo>(stateInfo, null);
branchState.setState(si.initialState(path));
if(node.getId() == endNode.getId()) {
return Evaluation.INCLUDE_AND_CONTINUE;
}
else {
return Evaluation.Evaluation.EXCLUDE_AND_CONTINUE;
}
}
int oldLabel = branchState.getState().label;
// DO something with the old label
if(node.getId() == endNode.getId()) {
return Evaluation.INCLUDE_AND_CONTINUE;
}
else {
return Evaluation.ofContinues(true); //EXCLUDE_AND_CONTINUE;
}
}
}
我使用TraversalDescription如下所示:
CustomPathEvaluator eval = new CustomPathEvaluator(endNode);
TraversalDescription desc = graphDb.traversalDescription()
.uniqueness(Uniqueness.NODE_PATH)
.sort(new Comparator<Path>() {
@Override
public int compare(Path o1, Path o2) {
return o1.length() - o2.length();
}
})
.evaluator(eval)
.breadthFirst()
.relationships(EdgeType.LINE_REL, Direction.OUTGOING)
.relationships(EdgeType.STATION_REL, Direction.OUTGOING)
.evaluator(Evaluators.toDepth(maxDepth));
for (Path path : desc.traverse(node1)) {
System.out.println(path);
}
CustomPathEvaluator eval=新的CustomPathEvaluator(endNode);
TraversalDescription desc=graphDb.TraversalDescription()
.唯一性(唯一性.节点\路径)
.sort(新的比较器(){
@凌驾
公共整数比较(路径o1,路径o2){
返回o1.length()-o2.length();
}
})
.评估员(eval)
.breadthFirst()
.关系(EdgeType.LINE\u REL、方向、传出)
.关系(EdgeType.STATION\u REL、Direction.OUTGOING)
.evaluator(Evaluators.toDepth(maxDepth));
用于(路径:描述遍历(节点1)){
System.out.println(路径);
}
我使用BranchState错误吗?如何从上一步获取stateInfo
谢谢我也有同样的问题。你找到了这个问题的解决方案吗?我想我已经找到了StartNodeTraversalBranch.newNextBranch,如果initialState==InitialBranchState.NO_state,状态就会丢失。对我来说,当框架以单向遍历描述对其进行初始化时,情况总是如此。我试图找出这是否是一个bug,或者如何在neo4j Slack上解决这个问题。Max de Marzi将我引向他的博客,在那里他解释了如何使用PathExpander而不是PathEvaluator解决问题。虽然我仍然不明白为什么PathEvaluator不能按预期工作,但这对我来说是可行的。
CustomPathEvaluator eval = new CustomPathEvaluator(endNode);
TraversalDescription desc = graphDb.traversalDescription()
.uniqueness(Uniqueness.NODE_PATH)
.sort(new Comparator<Path>() {
@Override
public int compare(Path o1, Path o2) {
return o1.length() - o2.length();
}
})
.evaluator(eval)
.breadthFirst()
.relationships(EdgeType.LINE_REL, Direction.OUTGOING)
.relationships(EdgeType.STATION_REL, Direction.OUTGOING)
.evaluator(Evaluators.toDepth(maxDepth));
for (Path path : desc.traverse(node1)) {
System.out.println(path);
}