2017-04-25 4 views
0

MERGEFOREACH節を利用して、Cypherで1つのバルク操作で2つのノード間に明確なリレーションシップを作成/更新しようとしています。Cypherを使用したNeo4Jでのリレーションのバルクマージ

今、私は次のようにそれを行うにしようとしていますが、それは文法的に正しくありません:

MERGE (u1:Person {id:1}) 
MERGE (u2:Person {id:3}) 
FOREACH (score IN [{name:'R1',val:1.0},{name:'R2',val:0.5}]| 
    MERGE (u1)-[r]-(u2) 
    WHERE type(r) = score.name 
    ON CREATE SET r.weight=score.val,r.created=timestamp(),r.updated=r.created 
    ON MATCH SET r.weight=score.val,r.updated=timestamp() 
) 

あなたはそれを達成するために私にクエリを提案してください可能性があります。

MERGE (u1)-[r]-(u2) 
WHERE type(r) = score.name 

が許可されていないタイプずに関係をCreting、またそれは関係のタイプに変数名(score.name)を使用することです:

答えて

0

私はあなたのクエリに問題がこれだと思います。

1)いくつかのコードからクエリを書く場合は、そこから名前を挿入します。例えば、PHPで:

.... 
$rels[] = [val => 1.0, name => 'R1']; 
foreach ($rels as $rel) { 
    $query[] = 'MERGE (u1)-[r:' . '$rel["name"]' . ']-(u2)'; 
    ON CREATE SET r.weight=score.val, r.created=timestamp(), r.updated=r.created 
    ON MATCH SET r.weight=score.val,r.updated=timestamp() 
} 
.... 

これはおそらく関係のために、「R」の識別子を再利用するのエラーを与えるだろうが、それはあまりにもそれが変数作る避けることができます。

2)お使いの環境では使用できないクリーナーソリューションは、APOCを使用することです。 Neo4j 3.0以降では、多くの機能をインストールすることができます。特にapoc.create.relationship.私はこのことに慣れていませんが、here it´s quite well explainedです。

とにかくここでも私はcurrent open issue at neo4j repositoryのままにしておくと便利です。

関連する問題