Java Neo4j遍历路径计算器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

我正在尝试使用TraversalDescription遍历一个图形。出于我的目的,有必要使用定制的evalute(Path,BranchState)方法实现来实现PathEvaluator。我通过创建一个名为CustomPathEvaluator的新类来实现PathEvaluator

我的问题是,当我在遍历中初始化BranchState并为其设置状态时,我无法在下一个子级恢复状态。这意味着BranchState设置为null。 下面是我的简化代码:

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