理解模式和neo4j-embedded
Comprehension pattern and neo4j-embedded
我在使用嵌入的 neo4j(版本 3.5.3)进行理解时遇到问题。
例如,这种查询在 neo4j enterprise 3.5.3 中工作得很好,但在 neo4j-embedded 中不工作:
MATCH (myNode:MyNode {myId:'myid'})
MATCH path = ( (myNode) -[*0..]- (otherNode:MyNode) )
WHERE
ALL(n in nodes(path) where [ (n)<--(state:MyState) | state.isConnected ][0] = true)
RETURN myNode, otherNode
我在使用 neo4j-embedded 时遇到的错误很难理解,看起来像是内部错误:
org.neo4j.driver.v1.exceptions.DatabaseException: This expression should not be added to a logical plan:
VarExpand(myNode, BOTH, OUTGOING, List(), otherNode, UNNAMED62, VarPatternLength(0,None), ExpandInto, UNNAMED62_NODES, UNNAMED62_RELS, Equals(ContainerIndex(PatternComprehension(None,RelationshipsPattern(RelationshipChain(NodePattern(Some(Variable( UNNAMED62_NODES)),List(),None,None),RelationshipPattern(Some(Variable( REL136)),List(),None,None,INCOMING,false,None),NodePattern(Some(Variable(state)),List(LabelName(MyState)),None,None))),None,Property(Variable(state),PropertyKeyName(isConnected))),Parameter( AUTOINT1,Integer)),True()), True(), List((Variable(n),Equals(ContainerIndex(PatternComprehension(None,RelationshipsPattern(RelationshipChain(NodePattern(Some(Variable(n)),List(),None,None),RelationshipPattern(Some(Variable( REL136)),List(),None,None,INCOMING,false,None),NodePattern(Some(Variable(state)),List(LabelName(MyState)),None,None))),None,Property(Variable(state),PropertyKeyName(isConnected))),Parameter( AUTOINT1,Integer)),True())))) {
LHS -> CartesianProduct() {
LHS -> Selection(Ands(Set(In(Property(Variable(myNode),PropertyKeyName(myId)),ListLiteral(List(Parameter( AUTOSTRING0,String))))))) {
LHS -> NodeByLabelScan(myNode, LabelName(MyNode), Set()) {}
}
RHS -> NodeByLabelScan(otherNode, LabelName(MyNode), Set()) {}
}
}
有什么想法吗?
这是一个相当复杂的问题,但这里有完整的解释。
首先,我发现它不是特定于 neo4j-embedded 的。内部错误异常是由于 Neo4J 中的断言而引发的, 只有在设置标志 -ea(启用断言)时才会触发异常。并且仅当 运行 使用 maven 或任何 IDE.
测试时才设置此标志
深入研究 github 上的 Neo4J 代码,我还发现添加这个断言是因为对递归理解模式的一些担忧。 (提交在这里:https://github.com/neo4j/neo4j/commit/dfbe8ce397f7b72cf7d9b9ff1500f24a5c4b70b0)
在我的例子中,我确实使用理解模式但不是递归的,所以我认为一切都应该没问题,除了单元测试:)
我已将问题提交给 Neo4J 的支持,他们将在未来的版本中提供修复。
我在使用嵌入的 neo4j(版本 3.5.3)进行理解时遇到问题。
例如,这种查询在 neo4j enterprise 3.5.3 中工作得很好,但在 neo4j-embedded 中不工作:
MATCH (myNode:MyNode {myId:'myid'})
MATCH path = ( (myNode) -[*0..]- (otherNode:MyNode) )
WHERE
ALL(n in nodes(path) where [ (n)<--(state:MyState) | state.isConnected ][0] = true)
RETURN myNode, otherNode
我在使用 neo4j-embedded 时遇到的错误很难理解,看起来像是内部错误:
org.neo4j.driver.v1.exceptions.DatabaseException: This expression should not be added to a logical plan:
VarExpand(myNode, BOTH, OUTGOING, List(), otherNode, UNNAMED62, VarPatternLength(0,None), ExpandInto, UNNAMED62_NODES, UNNAMED62_RELS, Equals(ContainerIndex(PatternComprehension(None,RelationshipsPattern(RelationshipChain(NodePattern(Some(Variable( UNNAMED62_NODES)),List(),None,None),RelationshipPattern(Some(Variable( REL136)),List(),None,None,INCOMING,false,None),NodePattern(Some(Variable(state)),List(LabelName(MyState)),None,None))),None,Property(Variable(state),PropertyKeyName(isConnected))),Parameter( AUTOINT1,Integer)),True()), True(), List((Variable(n),Equals(ContainerIndex(PatternComprehension(None,RelationshipsPattern(RelationshipChain(NodePattern(Some(Variable(n)),List(),None,None),RelationshipPattern(Some(Variable( REL136)),List(),None,None,INCOMING,false,None),NodePattern(Some(Variable(state)),List(LabelName(MyState)),None,None))),None,Property(Variable(state),PropertyKeyName(isConnected))),Parameter( AUTOINT1,Integer)),True())))) {
LHS -> CartesianProduct() {
LHS -> Selection(Ands(Set(In(Property(Variable(myNode),PropertyKeyName(myId)),ListLiteral(List(Parameter( AUTOSTRING0,String))))))) {
LHS -> NodeByLabelScan(myNode, LabelName(MyNode), Set()) {}
}
RHS -> NodeByLabelScan(otherNode, LabelName(MyNode), Set()) {}
}
}
有什么想法吗?
这是一个相当复杂的问题,但这里有完整的解释。 首先,我发现它不是特定于 neo4j-embedded 的。内部错误异常是由于 Neo4J 中的断言而引发的, 只有在设置标志 -ea(启用断言)时才会触发异常。并且仅当 运行 使用 maven 或任何 IDE.
测试时才设置此标志深入研究 github 上的 Neo4J 代码,我还发现添加这个断言是因为对递归理解模式的一些担忧。 (提交在这里:https://github.com/neo4j/neo4j/commit/dfbe8ce397f7b72cf7d9b9ff1500f24a5c4b70b0)
在我的例子中,我确实使用理解模式但不是递归的,所以我认为一切都应该没问题,除了单元测试:)
我已将问题提交给 Neo4J 的支持,他们将在未来的版本中提供修复。