2015-05-14 96 views
0

我试图用Cypher语句将几个节点和边插入到Neo4j图中。在执行查询后,我从服务器收到一个不太有意义的scala.MatchError响应。我在版本2.2.0中使用Neo4j。Cypher上的“scala.MatchError”CREATE查询

这是我的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 

我正在使用everyman/neo4jphp库从我的PHP应用程序访问Neo4j。我怀疑相关性不大的公司,不过,因为使用命令行上简单的卷曲呼叫直接谈论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 

这个错误是什么意思,为什么我收到它?

回答

1

结果发现实际上有一个错误报告目前的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; 
}