"scala.MatchError" 关于 Cypher CREATE 查询
"scala.MatchError" on Cypher CREATE query
我正在尝试使用 Cypher 语句 将一些节点和边插入 Neo4j 图中。执行查询后,我从服务器得到一个意义不大的 scala.MatchError
响应。我在 2.2.0 版中使用 Neo4j。
这是我的 Cypher 查询(请注意,它最初是 much 更大查询的一部分,但这是我将其缩小到的内容):
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.apply(CreateNode.scala:40)
at org.neo4j.cypher.internal.compiler.v2_2.mutation.CreateNode$$anonfun$org$$$$c818f6fea869bbb25aedba7c5faae2d$$$$e$$fromAnyToLiteral.apply(CreateNode.scala:40)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map.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
我正在使用 everyman/neo4jphp 库从我的 PHP 应用程序访问 Neo4j。不过,我怀疑这无关紧要,因为在命令行上使用简单的 cURL 调用直接与 REST API 对话时,错误也可以重现:
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
这个错误是什么意思,我为什么会收到这个错误?
事实证明,当前 Neo4j 版本实际上有一个 错误报告 discussed on 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;
}
我正在尝试使用 Cypher 语句 将一些节点和边插入 Neo4j 图中。执行查询后,我从服务器得到一个意义不大的 scala.MatchError
响应。我在 2.2.0 版中使用 Neo4j。
这是我的 Cypher 查询(请注意,它最初是 much 更大查询的一部分,但这是我将其缩小到的内容):
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.apply(CreateNode.scala:40)
at org.neo4j.cypher.internal.compiler.v2_2.mutation.CreateNode$$anonfun$org$$$$c818f6fea869bbb25aedba7c5faae2d$$$$e$$fromAnyToLiteral.apply(CreateNode.scala:40)
at scala.collection.TraversableLike$$anonfun$map.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map.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
我正在使用 everyman/neo4jphp 库从我的 PHP 应用程序访问 Neo4j。不过,我怀疑这无关紧要,因为在命令行上使用简单的 cURL 调用直接与 REST API 对话时,错误也可以重现:
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
这个错误是什么意思,我为什么会收到这个错误?
事实证明,当前 Neo4j 版本实际上有一个 错误报告 discussed on 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;
}