我试图在Cypher中使用单个批量操作创建/更新两个节点之间的不同关系,并利用MERGE
和FOREACH
子句。
现在,我正在尝试使用以下内容,但它在语法上不正确:
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 :(得分:0)
我认为您的查询存在问题:
MERGE (u1)-[r]-(u2)
WHERE type(r) = score.name
不允许创建没有类型的关系,也不允许使用变量名称(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,以防它有用。