【问题标题】:Neo4j node property arrays to create relationshipsNeo4j 节点属性数组来创建关系
【发布时间】:2018-11-04 15:27:41
【问题描述】:

我真的很喜欢 Neo4j,但我被这个小问题困住了。我的数据有电影节点、演员节点和 ACTED_IN 关系。例如:

(a:Actor {name: 'Leonardo DiCaprio'})-[r:ACTED_IN]->(m:Movie {name: 'Titanic'})

但有些电影将演员作为逗号分隔的数组嵌套在一个名为 cast 的属性中。例如:

(m:Movie {name: 'Oceans Eleven',  
   cast: 'George Clooney,Brad Pitt,Andy García,Julia Roberts,Matt Damon'})

如何将演员表属性转换为唯一的 ACTED_IN 关系?

【问题讨论】:

标签: database graph neo4j cypher


【解决方案1】:

这个查询需要使用SPLIT()UNWIND

MATCH (m:Movie {title: 'Oceans Eleven'}) 
WITH m, SPLIT(m.cast, ',') AS list_actors
UNWIND list_actors AS actor
MERGE (m)<-[:ACTED_IN]-(:Actor{name: actor})

然后你可以检查结果:

MATCH p=(m:Movie {title: 'Oceans Eleven'})-[]-(n) RETURN p

【讨论】:

  • 如果我不想创建多个 Oceans Eleven 节点。我是否只是简单地使用 MERGE?
  • 您可以将最后一行替换为:“CREATE (m)Movie 节点。但是,如果关系已经存在,则会创建一个重复的关系。将CREATE 更改为MERGE 将解决后一个问题。
【解决方案2】:

这是一种方法,它也可以避免创建重复的节点和关系:

MATCH (m:Movie {name: 'Oceans Eleven'})
FOREACH(c IN SPLIT(m.cast, ',') |
  MERGE (a:Actor {name: c})
  MERGE (a)-[r:ACTED_IN]->(m)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多