使用Cypher在Neo4J中大量合并关系

时间:2017-04-25 10:55:55

标签: neo4j cypher bulk

我试图在Cypher中使用单个批量操作创建/更新两个节点之间的不同关系,并利用MERGEFOREACH子句。

现在,我正在尝试使用以下内容,但它在语法上不正确:

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()
)

请您提出一个查询来实现这一目标。

1 个答案:

答案 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,以防它有用。