Neo4j遍历描述 - 自定义评估器

时间:2016-12-30 09:54:54

标签: java neo4j

我正在使用Neo4j Traversal Framework(Java)。 我需要创建自定义evalutor以包含某些条件为真的节点

我的代码是:

    @Override
        public Evaluation evaluate(Path path) {
            log.info("Node Id: " + path.endNode().getProperty("DIST_ID"));
            long mCount = 0;
            if ((Long) path.endNode().getProperty("RANK") >= 3) {
                mCount++;
            }
            log.info("mCount " + mCount);
            return Evaluation.INCLUDE_AND_CONTINUE;
        }
    };

    TraversalDescription traversalDescription = db.traversalDescription();
    Traverser traverser = traversalDescription.breadthFirst()
            .relationships(RelationshipTypes.SPONSOR, Direction.OUTGOING).evaluator(e).traverse(DSTS);

DSTS是传入节点。它意味着顶级节点。我想使用rank来分割下行节点。如果我需要两个级别,所以我想通过使用rank来分割两个级别.rank是node.if的属性之一是5我想收集这个节点和它将传出节点,直到获得排名5.

如有可能请指导我......

1 个答案:

答案 0 :(得分:1)

您可以查看分支状态,即使用evaluate方法,该方法也采用BranchState参数。您可以使用它来保持每个访问的遍历分支的状态,并在向下移动遍历分支时进行扩充。 E.g。

new PathEvaluator<Long> {        
    public Evaluation evaluate(Path path, BranchState<Long> state) {
        log.info("Node Id: " + path.endNode().getProperty("DIST_ID"));
        long mCount = state.getState();
        if ((Long) path.endNode().getProperty("RANK") >= 3) {
            mCount++;
            state.setState( mCount );
        }
        if ( mCount >= 5 ) {
            // do something
        }
        log.info("mCount " + mCount);
        return Evaluation.INCLUDE_AND_CONTINUE;
    }
}

这相当于在每个评估中从整个路径总结RANK,但是BranchState使其更具性能。

这是你想到的吗?