2016-09-08 6 views
0

ノードのラベルを動的に更新しようとしましたが、成功しませんでした。私はノードのすべてのラベルを削除したい、そして、私は同じノードにラベルの新しいリストを設定したいと思った。すべてのラベルを削除してラベルの新しいリストを動的に設定する

私のアプローチ(失敗した、唯一のラベルを削除しようとした):

私はラベルが参照を使用して動的に変更することがカント、と思われます。私の理解は正しいのですか?そして、これをどのように達成できますか?

+0

I:

UPDATE

APOCのソースを確認した後、例えば、非マッチングラベルを通過除去するsetLabels手順があります私はあなたの問題を正しく理解していますが、このクエリを試してください。既存のラベルを削除して新しいラベルを貼り付けることができます。既存のラベルとして「NewLabel」を設定し、新しいラベルとして「Person」&「Profession」を使用します。あなたは一致している間あなた自身の条件を置くことができます。 'match(n)REMOVE n:NewLabel SET n:Person:職業復帰n ' – Gandalf

+0

既存のラベルが' NewLabel 'であることがわからない場合は、どのようにラベルを削除しますか? –

答えて

3

あなたが言うように、生のサイファーでは動的ラベルの変更はできません。主に、ラベル、プロパティキー、リレーションシップタイプはクエリプランの一部であり、キャッシュに使用されるためです。

ここで説明するように、APOCの手順を使用して動的にラベルを追加する可能性があります:

https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_using_cypher_and_apoc_to_move_a_property_value_to_a_label

MATCH (n:Movie) 
CALL apoc.create.addLabels(id(n), [ n.genre ]) YIELD node 
REMOVE node.studio 
RETURN node 

たぶん、既存のラベルを削除/交換する機能がAPOCに素晴らしい追加することができ。

WITH ["A","B"] as labels 
MATCH (m:Movie) 
WITH collect(id(m))[0..20] as movies, labels 
CALL apoc.create.setLabels(movies, labels) YIELD node RETURN node, labels(node) 


│node       │labels(node)│ 
╞══════════════════════════════╪════════════╡ 
│{tagline: Prepare to enter a s│[B, A]  │ 
│ecret world of assassins, titl│   │ 
│e: Ninja Assassin, released: 2│   │ 
│009}       │   │ 
├──────────────────────────────┼────────────┤ 
│{tagline: Walk a mile you'll n│[B, A]  │ 
│ever forget., title: The Green│   │ 
│ Mile, released: 1999}  │   │ 
├──────────────────────────────┼────────────┤ 
│{tagline: 400 million people w│[B, A]  │ 
│ere waiting for the truth., ti│   │ 
│tle: Frost/Nixon, released: 20│   │ 
│08}       │   │ 
├──────────────────────────────┼────────────┤ 
│{tagline: He didn't want law. │[B, A]  │ 
│He wanted justice., title: Hof│   │ 
│fa, released: 1992}   │   │ 
├──────────────────────────────┼────────────┤ 

解決される問題:)

関連する問題