2016-12-31 6 views
0

のすべてのノード間でプロパティを追加/削除します: '名前'、 '年齢'、年齢:42}CYPHER次の例データと同じラベル

質問:ラベルpersonのすべてのノードでプロパティ['id'、 'name'、 'age'、 'デフォルトの空の値を持つノードに不足しているプロパティが追加され、cypherのみを使用するようにします。

私は次のようapoc.map.merge({first},{second}) yield valueの手順を使用して結ばれています:

match (p:Person) 
call apoc.map.merge(proeprties(p),{id:'',name:'',age:'',lastname:''}) yield value 
return value 

しかし、私はこのエラーを得た:

There is no procedure with the name apoc.map.merge registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.

私は場所に

bash-4.3# ls -al /var/lib/neo4j/plugins/apoc-3.1.0.3-all.jar 
-rw-r--r-- 1 root  root  1319762 Dec 14 02:19 /var/lib/neo4j/plugins/apoc-3.1.0.3-all 

をAPOCを持って確認することができますがとapoc.helpに表示されます

neo4j-sh (?)$ call apoc.help("map.merge"); 
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| type  | name     | text                    | signature             | roles | writes | 
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| "function" | "apoc.map.merge"  | "apoc.map.merge(first,second) - merges two maps"         | "apoc.map.merge(first :: MAP?, second :: MAP?) :: (MAP?)" | <null> | <null> | 
| "function" | "apoc.map.mergeList" | "apoc.map.mergeList([{maps}]) yield value - merges all maps in the list into one" | "apoc.map.mergeList(maps :: LIST? OF MAP?) :: (MAP?)"  | <null> | <null> | 
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
2 rows 
47 ms 

答えて

1

これは関数なので、CALLやYIELDのようなプロシージャを使用して呼び出す必要はありません。これは動作するはずです:あなたはノードのプロパティを更新するには、SETを使用していないので、

match (p:Person) 
RETURN apoc.map.merge(properties(p),{id:'',name:'',age:'',lastname:''}) 

は、このクエリは唯一返されるものに影響を与えることに留意してください。

代わりapoc.map.mergeを使用してのノードのプロパティを更新する+=演算子を使用することができます。

match (p:Person) 
set p += {id:'',name:'',age:'',lastname:''} 

はこれとapoc.map.merge両方が既存の値を置き換えますことを覚えておいてください、あなたはすべての人のためにID、名前、年齢、姓を空白にします。

現時点では、既存のプロパティを置き換えるのではなく、プロパティをマージする機能がNeo4jまたはAPOCにあるとは思いません。つまり、使用する回避策がいくつかあります。

COALESCE()は、値がnullの場合に使用するデフォルトを指定できるため、これに便利な機能です。プロパティがnullの場合、デフォルトとして提供され、空の文字列を使用して、人:

match (p:Person) 
with {id:COALESCE(p.id, ''), name:COALESCE(p.name, ''), age:COALESCE(p.age, ''), 
    lastname:COALESCE(p.lastname, '')} as newProps 
set p += newProps 

たとえば、すべてのプロパティを更新するために、これを使用する場合があります

関連する問題