Шаблон понимания и neo4j-встроенный - PullRequest
1 голос
/ 25 марта 2019

У меня проблема при использовании понимания со встроенным 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-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()) {}
  }
}

Есть идеи?

1 Ответ

0 голосов
/ 13 мая 2019

Это был довольно сложный вопрос, но вот полное объяснение.Во-первых, я обнаружил, что это не относится к neo4j-embedded.Исключение из-за внутренней ошибки возникло из-за утверждения в Neo4J, ведь оно будет вызывать исключение, только если установлен флаг -ea (включить подтверждения).И этот флаг устанавливается только при запуске тестов с maven или любой IDE.

Детализация кода Neo4J на github, я также обнаружил, что это утверждение было добавлено из-за некоторых проблем с рекурсивным шаблоном понимания.(Коммит здесь: https://github.com/neo4j/neo4j/commit/dfbe8ce397f7b72cf7d9b9ff1500f24a5c4b70b0)

В моем случае я использую шаблон понимания, но не рекурсивно, поэтому я думаю, что все должно быть хорошо, за исключением случаев, когда выполняется модульное тестирование:)

Я отправилпроблема в поддержке Neo4J, и они будут исправлены в следующем выпуске.

...