Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 更复杂的密码查询,如TraversalDescription_Neo4j_Cypher - Fatal编程技术网

Neo4j 更复杂的密码查询,如TraversalDescription

Neo4j 更复杂的密码查询,如TraversalDescription,neo4j,cypher,Neo4j,Cypher,我不知道如何在Java中构建以下cypher查询作为TraversalDescription: START container=node(startContainerId), condition=node(startConditionId) MATCH container-[:CONTAINS*]->items-[*]->condition WHERE items.type! = 'instance' RETURN items 我只能实现第一部分,即获取给定“容器”中的所有“项目”

我不知道如何在Java中构建以下cypher查询作为TraversalDescription:

START container=node(startContainerId), condition=node(startConditionId) MATCH container-[:CONTAINS*]->items-[*]->condition WHERE items.type! = 'instance' RETURN items
我只能实现第一部分,即获取给定“容器”中的所有“项目”:

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

谢谢你的帮助。
向你问好,马克斯我在想:

private static class MyExpander implements PathExpander { private final boolean forward; MyExpander( boolean forward ) { this.forward = forward; } @Override public Iterable expand( Path path, BranchState state ) { boolean instance = state.getState(); if ( !instance && (instance = "instance".equals( path.endNode().getProperty( "type", null )) ) ) state.setState( instance ); Direction direction = forward ? OUTGOING : INCOMING; return (forward ? instance : !instance) ? path.endNode().getRelationships( direction ) : path.endNode().getRelationships( CONTAINS, direction ); } @Override public PathExpander reverse() { return new MyExpander( !forward ); } } TraversalDescription side = traversal( NODE_PATH ) .expand( new MyExpander( true ), new InitialBranchState.State( FALSE, FALSE ) ); BidirectionalTraversalDescription traverser = bidirectionalTraversal().collisionEvaluator( new PathEvaluator.Adapter() { @Override public Evaluation evaluate( Path path, BranchState state ) { return Evaluation.ofIncludes( state.getState() ); } } ).mirroredSides( side ); 私有静态类MyExpander实现PathExpander { 私有最终布尔向前; MyExpander(布尔向前) { this.forward=向前; } @凌驾 公共Iterable扩展(路径、分支状态) { 布尔实例=state.getState(); 如果(!instance&&(instance=“instance”.equals(path.endNode().getProperty(“type”,null))) state.setState(实例); 方向=前进?出站:进站; 返回(转发?实例:!实例)? path.endNode().getRelationships(方向): path.endNode().getRelationships(包含、方向); } @凌驾 公共路径扩展器反向() { 返回新的MyExpander(!forward); } } TraversalDescription侧=遍历(节点路径) .expand(新MyExpander(true),新InitialBranchState.State(FALSE,FALSE)); BidirectionalTraversalDescription遍历器=bidirectionalTraversal().collisionEvaluator(新路径Evaluator.Adapter()) { @凌驾 公共评估评估(路径、分支状态) { 返回Evaluation.ofIncludes(state.getState()); } })。镜侧(侧面);
尽管我注意到碰撞计算器有一个问题,导致了一个异常。在neo4j代码库中本地修复了它。

对于我使用的“Evaluator”,您不使用“MyExpander”类吗?双向电话到底在做什么?它是从两个不同的点开始的吗?将过滤放在扩展器中的不同之处在于,它减少了在evaluator中尽早访问的路径数,而不是稍后访问的路径数(因此应该是性能优化)。是的,双向td将让遍历器从两个点开始,并查看它们在哪里相遇,这也可能会在许多场景中大幅减少要访问的路径数。 private static class MyExpander implements PathExpander { private final boolean forward; MyExpander( boolean forward ) { this.forward = forward; } @Override public Iterable expand( Path path, BranchState state ) { boolean instance = state.getState(); if ( !instance && (instance = "instance".equals( path.endNode().getProperty( "type", null )) ) ) state.setState( instance ); Direction direction = forward ? OUTGOING : INCOMING; return (forward ? instance : !instance) ? path.endNode().getRelationships( direction ) : path.endNode().getRelationships( CONTAINS, direction ); } @Override public PathExpander reverse() { return new MyExpander( !forward ); } } TraversalDescription side = traversal( NODE_PATH ) .expand( new MyExpander( true ), new InitialBranchState.State( FALSE, FALSE ) ); BidirectionalTraversalDescription traverser = bidirectionalTraversal().collisionEvaluator( new PathEvaluator.Adapter() { @Override public Evaluation evaluate( Path path, BranchState state ) { return Evaluation.ofIncludes( state.getState() ); } } ).mirroredSides( side );