& Quot; scala.MatchError & Quot; по запросу Cypher CREATE

Я пытаюсь вставить несколько узлов и ребер в Neo4j используя график Cypher заявления. После выполнения запроса я получаю не очень значимый scala.MatchError ответ от сервера. Я использую Neo4j в версия 2.2.0.

Это мой запрос Cypher (обратите внимание, что он изначально является частью много большой запрос, но это то, к чему я его сузил):

CREATE (node55549aefd9aa7:Arg {prop_node55549aefd9aa7})

Аргументы для этого запроса (в нотации JSON):

{
"prop_node55549aefd9aa7": {
"startLine": 48,
"endLine": 51,
"type": 1,
"byRef": false,
"variadic": false,
"name": "query",
"default": null,
"__node_id": "node55549aefd9aa7"}
}

Это ответ об ошибке, который я получаю:

scala.MatchError: (default,null) (of class scala.Tuple2)
at org.neo4j.cypher.internal.compiler.v2_2.mutation.CreateNode$$anonfun$org$$$$c818f6fea869bbb25aedba7c5faae2d$$$$e$$fromAnyToLiteral$1$1.apply(CreateNode.scala:40)
at org.neo4j.cypher.internal.compiler.v2_2.mutation.CreateNode$$anonfun$org$$$$c818f6fea869bbb25aedba7c5faae2d$$$$e$$fromAnyToLiteral$1$1.apply(CreateNode.scala:40)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
// Several dozen lines of stack trace omitted

Я использую обыватель / neo4jphp библиотека для доступа к Neo4j из моего PHP-приложения. Я подозреваю, что это не имеет большого значения, потому что ошибка также воспроизводима при непосредственном обращении к REST API с помощью простого вызова cURL в командной строке:

curl -D - \
--user neo4j:XXXX \
-H "content-type: application/json" \
-d'{"statements":[{"statement":"CREATE (node55549aefd9aa7:Arg {prop_node55549aefd9aa7})", "parameters": {"prop_node55549aefd9aa7": {"startLine": 48, "endLine": 51, "type": 1, "byRef": false, "variadic": false, "name": "query", "default": null, "__node_id": "node55549aefd9aa7"}}}]}' \
http://localhost:7474/db/data/transaction/commit

Что означает эта ошибка и почему я ее получаю?

0

Решение

Оказывается, на самом деле есть сообщение об ошибке для текущих версий Neo4j для этой проблемы, которая обсуждали на GitHub. Какие scala.MatchError: (default,null) на самом деле означает это то, что default собственность имеет null значение, которое, по-видимому, недопустимо в Neo4j.

В CREATE операторы, свойства узла не должен содержать null ценности. Из прочтения проблемы GitHub я не совсем уверен, если это сделано по замыслу (и это просто сообщение об ошибке, которое неясно) или фактическая ошибка. В любом случае, запрос может быть успешно выполнен, просто опуская null свойства из аргументов запроса:

{
"prop_node55549aefd9aa7": {
"startLine": 48,
"endLine": 51,
"type": 1,
"byRef": false,
"variadic": false,
"name": "query",
# "default": null,  <-- Remove the "default" property!
"__node_id": "node55549aefd9aa7"}
}

К счастью, определяя свойства как null или не определяя их вообще семантически эквивалентный в Neo4j. Это означает, что ограничения запроса, такие как WHERE node.default IS NULL будет по-прежнему соответствовать узлам, где default свойство не определено вообще.

На стороне приложения, простая конструкция фильтра может быть использована для предотвращения null Значения от использования в качестве свойств:

$properties = array_filter($properties, function($value) {
return $value !== NULL;
}
1

Другие решения

Других решений пока нет …