2017-04-25 764 views
0

我試圖通過使用MERGEFOREACH條款在Cypher中使用單個批量操作來創建/更新兩個節點之間的不同關係。使用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() 
) 

可以請你建議我查詢來實現這一目標。

回答

0

我覺得跟您的查詢的問題是這樣的:

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

Creting關係沒有一個類型是不允許的,也不是爲關係型使用一個變量名(score.name)。我只能提出兩個部分解決方案:

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萬一它有用。