2015-05-14 37 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; 
}