【问题标题】:Neo4j how to make a relationNeo4j如何建立关系
【发布时间】:2017-05-27 22:25:10
【问题描述】:

我有 2 个节点,属性名为 A 和 B。每个节点都保存了多个电话联系人。

  • 用户 A 的联系人中有用户 C

  • 用户 B 的联系人中有用户 C

如何将用户 C 与他 KNOWS 用户 A 和 B 的关系联系起来?

首先我必须合并用户 C,而不是创建一个名为 KNOWS 的关系。

【问题讨论】:

  • 嗨@Chadi,如果其中一个答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: neo4j cypher


【解决方案1】:

如何将用户 C 与他知道用户 A 和 B 的关系联系起来?

简单地做:

MATCH(a {name:"A"}) // Match nodes with property name = "A" and store it in a variable
MATCH(b {name:"B"}) // Match nodes with property name = "B" and store it in b variable
MERGE (c {name:"C"}) // merge c (will be created if a node with name = "C does not exists yet")
CREATE UNIQUE (c)-[:KNOWS]->(a) // Will create :KNOWS relationship from c to a if it not exists
CREATE UNIQUE (c)-[:KNOWS]->(b) // Will create :KNOWS relationship from c to b if it not exists

【讨论】:

    【解决方案2】:

    您还可以使用 MERGE 一步创建 C 和 KNOWS 关系:

    MATCH (a:user {name:'A'}) MERGE (c:user {name:'C'})-[:KNOWS]->(a);
    

    在这里,您正在寻找具有属性 name='A' 的 :user 节点。如果找到,则将结果传递给 MERGE 子句。你给 MERGE 一个完整的路径; MERGE 将创建路径中不存在的部分。在这种情况下,它将创建一个类型为 :user 的节点,并将其 name 属性设置为 'C';它还将创建一个从 C 到 A 的 :KNOWS 关系。MERGE 将使用它已经给出的现有节点 a。这样一来,MERGE 与 CREATE 不同,因为 CREATE 会尝试创建所有内容,包括新节点 a。

    如果您要在节点 C 上设置其他属性,您可以使用 ON CREATE 子句同时设置这些属性:

    MATCH (a:user {name:'A'}) MERGE (c:user {name:'C'})-[:KNOWS]->(a) ON CREATE SET c={name:'C', phone:'+1 234 5678'};
    

    【讨论】: