【问题标题】:LOAD CSV with a collection using MATCH and FOREACH to form a relationship使用 MATCH 和 FOREACH 与集合一起加载 CSV 以形成关系
【发布时间】:2016-08-03 19:54:02
【问题描述】:

我有一个 CSV 文件,其中包含以下形式的信息:

Col1,Col2
A,B;C;D

我正在尝试在 A 和 B、C、D 中的每一个之间生成关系。在我的特定情况下,B、C、D 已经通过导入另一个 CSV 文件来创建。因此,我不需要创建这些节点,但我确实需要匹配它们以获取节点以形成关系。

LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
WITH line

MERGE (a:Item {name: line.Col1})

FOREACH (x IN SPLIT(line.Col2, ';') |
  MATCH (s:Item {name: x})
  CREATE UNIQUE (s)-[:rel]->(a));

节点 B、C、D 有多个属性,其中只有一个在第二个 CSV 中,如:

B: {id: 123, name: B}

有没有办法用 Cypher 做到这一点?目前,我收到错误消息:“在 FOREACH 中使用 MATCH 无效”。使用 MERGE 而不是 MATCH 会产生新的、不需要的节点。

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    简单地使用MERGE 代替MATCH

    LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
    WITH line
    
    MERGE (a:Item {name: line.Col1})
    
    FOREACH (x IN SPLIT(line.Col2, ';') |
      MERGE (s:Item {name: x})
      MERGE (s)-[:rel]->(a));
    

    如果match比较复杂,那你可以先做个选择,然后往上面走:

    LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS line
    MERGE (a:Item {name: line.Col1})
    WITH a, SPLIT(line.Col2, ';') as names
    UNWIND names as x
    MATCH (t:Item {name: x})
    WITH a, collect(t) as sc
    
    FOREACH (x IN sc |
      CREATE UNIQUE (x)-[:rel]->(a));
    

    【讨论】:

    • 这在我的情况下不起作用,因为我在匹配的节点上有多个属性。我编辑了问题以反映问题的这个缺失部分。
    • @cannin 我扩展了我的答案。
    猜你喜欢
    • 2012-08-10
    • 2013-01-11
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多