2017-05-02 7 views
3

私はNeo4J JDBCドライバを使って準備文を扱っています。ノードと関係ラベルを作成する必要があります。名前は、受け取るデータによって決まります。データ駆動型のノードまたは関係ラベルを使用してマージすることはできますか?

例えば、私はこれらの線に沿って準備されたステートメントを作成したいと思います:それはのNeo4jを思わとして

MERGE (test:{1} {id: {2}) ON CREATE SET test.id = {2}

OR

MERGE (test:Test)-[:{1}]->(test2:Test)

これらは現在、動作しません。プレースホルダーとしてプレースホルダー{1}を解釈せず、無効なラベル名として解釈します。

私が検討している別の可能性は、私たちが同じ制限に遭遇する可能性があると思うが、私たちはストアドプロシージャを介してCypherを拡張できるかもしれないということです。

誰かがCypherでこれを達成する方法があるかどうかについての洞察を提供することができます。

ありがとうございます!

UPDATE:

以下の答えは、APOCのapoc.create.node手順を用いることが提案されているが、私は必要なのは、ダイナミックラベルにマージすることです。これを反映するようにタイトルを更新しました。

+0

こんにちは! [この関連する質問です](http://stackoverflow.com/questions/43594138/neo4j-create-the-opposite-edge)を参照してください。 –

+0

ありがとう@BrunoPeres - 何とか私の検索中にそれを見つけることができませんでした! – cstaikos

答えて

2

私はAPOCは異なる手順を使用して終了 - apoc.cypher.doIt、それはAPOCはまだのような動的ラベルをマージする方法はありませんが判明したとして。機能リクエストを見る:https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/271

以下は、私がやったことです。このコレクションから引き出され、次いで既存のノードと新しいノードとの間の関係をマージする必要がコレクション上(UNWINDを使用して、この場合の)反復及び動的ラベルでノードをマージすることであったことに注意してください。

WITH myNode, myList 
UNWIND categories AS catArray 
WITH myNode, 'MERGE (cat:' + catArray[0] + ' {value: "' + catArray[1] + '" }) ON CREATE SET cat.value = \"' + catArray[1] + '\" RETURN cat' AS cypher 
CALL apoc.cypher.doIt(cypher, {}) YIELD value 
WITH myNode, value.cat as cat 
MERGE (myNode)-[:IN_CATEGORY]->(cat) 
1

APOCを使用して動的な関係を作成できます。動的ラベルを持つノードを作成したり、ノードに動的ラベルを追加したりする同様のAPOC手順があります。

MERGE (test:Test {name: 'Test'}) 
WITH test 
MERGE (test2:Test {name: 'Test 2'}) 
WITH test, test2 
CALL apoc.create.relationship(test, {new_rel_type}, {}, test2) YIELD rel 
RETURN test, test2, rel 
+1

パーフェクト、thanks @ dave-bennett - サンドボックスで試してみましたが、APOCプラグインのデプロイ後に動作するようです。 'YIELD new_rel'は私にエラーを出しました:'未知の手続き出力: 'new_rel'' - 出力が 'rel'と呼ばれるように見えます。 – cstaikos

+0

あなたは 'CREATE'の代わりに' MERGE'を使ってこれを行う方法を知っていますか?私はAPOCのドキュメントを見てきましたが、現在サポートされているようではありません。 – cstaikos

+0

質問を更新し、これを受け入れられた回答として削除しました – cstaikos

0

、ほぼ半日を試みた後、私は最終的にこの方法を見つける:

UNWIND {batch} as row MERGE (n { id: row.id }) SET n += row.properties WITH n CALL apoc.create.addLabels(id(n), [n.label]) YIELD node RETURN node をし、パフォーマンスは、純粋にMERGEとほぼ同じです。

多くのありがとうございました。SET label : pass label name as parameter

関連する問題