理解模式和neo4j嵌入

时间:2019-03-25 10:23:03

标签: neo4j neo4j-embedded

将理解与neo4j嵌入式(版本3.5.3)一起使用时,我遇到问题。

例如,这种查询在neo4j enterprise 3.5.3中可以很好地工作,但不适用于neo4j嵌入式:

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嵌入式时出现的错误很难理解,看起来像是内部错误:

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()) {}
  }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个非常复杂的问题,但这是完整的解释。 首先,我发现它不是特定于neo4j嵌入式的。内部错误异常是由于Neo4J中的一个断言而引起的,只有设置了标志-ea(启用断言),女巫才会触发异常。而且仅在使用maven或任何IDE运行测试时设置此标志。

在github上挖掘Neo4J的代码,我还发现添加此断言是由于对递归理解模式的某些担忧。 (提交在这里:https://github.com/neo4j/neo4j/commit/dfbe8ce397f7b72cf7d9b9ff1500f24a5c4b70b0

就我而言,我确实使用了理解模式,但没有递归使用,所以我认为一切都应该没问题,除非进行单元测试:)

我将该问题提交了Neo4J的支持,他们将在以后的版本中提供修复程序。