2017-04-25 762 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万一它有用。