0

我不知道,如何在 Java 中将以下密码查询构建为 TraversalDescription:

START container=node(startContainerId), condition=node(startConditionId) MATCH container-[:CONTAINS*]->items-[*]->condition WHERE items.type! = 'instance' RETURN items

我只能实现第一部分,在给定的“容器”中获取所有“项目”:

TraversalDescription td = Traversal.description().depthFirst()
                .relationships(Neo4JRelTypes.CONTAINS, Direction.OUTGOING).evaluator(new Evaluator() {

                    @Override
                    public Evaluation evaluate(Path path) {
                        if (path.endNode().getProperty("type").equals("instance")) {
                            return Evaluation.INCLUDE_AND_CONTINUE;
                        } else {
                            return Evaluation.EXCLUDE_AND_CONTINUE;
                        }
                    }
                });

但是,如何使用与特定节点匹配的传出关系过滤这些“项目”?我想测试这个密码查询和类似的 TraversalDescription 之间的性能。

感谢您的帮助。最好的问候, 马克斯

4

1 回答 1

2

我在想类似的事情:

    私有静态类 MyExpander 实现 PathExpander
    {
        私人最终布尔转发;

        MyExpander(布尔前向)
        {
            this.forward = 转发;
        }

        @覆盖
        公共可迭代扩展(路径路径,分支状态状态)
        {
            布尔实例 = state.getState();
            if ( !instance && (instance = "instance".equals( path.endNode().getProperty( "type", null )) ) )
                state.setState(实例);
            方向 方向 = 前进 ? 传出:传入;
            返回(转发?实例:!实例)?
                    path.endNode().getRelationships( 方向 ) :
                    path.endNode().getRelationships( 包含,方向 );
        }

        @覆盖
        公共路径扩展器反向()
        {
            return new MyExpander(!forward);
        }
    }

    TraversalDescription side = 遍历(NODE_PATH)
                .expand(new MyExpander(true), new InitialBranchState.State(FALSE, FALSE));

        BidirectionalTraversalDescription 遍历器 = bidirectionalTraversal().collisionEvaluator(new PathEvaluator.Adapter()
        {
            @覆盖
            公共评估评估(路径路径,分支状态状态)
            {
                return Evaluation.ofIncludes(state.getState());
            }
        } ).mirroredSides( 边 );

虽然我注意到碰撞评估器有问题,导致异常。在 neo4j 代码库中本地修复它。

于 2013-04-29T21:44:19.470 回答