【问题标题】:More complex Cypher Query as TraversalDescription更复杂的密码查询作为 TraversalDescription
【发布时间】:2013-04-29 12:06:41
【问题描述】:

我不知道,如何在 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 之间的性能。

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我在想这样的事情:

    私有静态类 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 代码库中本地修复。

    【讨论】:

    • 你不使用“MyExpander”类,就像我使用“Evaluator”一样吗? BidirectionalTD 到底在做什么?是从两个不同的点出发吗?
    • 在扩展器中放置过滤的不同之处在于它减少了在评估器中较早访问的路径数量,而不是较晚访问的路径数(因此应该是性能优化)。是的,双向 td 将使遍历器从两个点开始并查看它们相遇的位置,这也可能会在许多情况下大大减少访问路径的数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多