【问题标题】:Bulk merge of relations in Neo4J using Cypher使用 Cypher 在 Neo4J 中批量合并关系
【发布时间】:2017-04-25 10:55:55
【问题描述】:

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

现在,我正在尝试使用以下方法,但语法不正确:

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

请您建议我一个查询来实现这一点。

【问题讨论】:

    标签: neo4j cypher bulk


    【解决方案1】:

    我认为您的查询的问题是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多