【问题标题】:Neo4J - How to create a new node based on splitting an existing relationship property and automatically creating a link?Neo4J - 如何基于拆分现有关系属性创建新节点并自动创建链接?
【发布时间】:2017-06-04 17:47:50
【问题描述】:

我有一个节点网络,代表,这些节点通过关系(电子邮件)连接起来。

电子邮件的收件人是 m.slug

基于:()-[r]-(m)

我希望拆分属性(在本例中为“Sender”/m.slug 即 Larry@google.com)并创建一个新节点“Google.com”AS Company(即我现在有一组 Company 节点根据现有信息创建)。

然后我想将 Google(公司)链接到我的个人节点 (Larry@Google.com)。

--

在不创建多个重复的公司节点的情况下,您将如何处理这个问题? (即对于 Sergey@Google.com 和 Larry@Google.com 应连接到同一个 Google.com 公司节点)。

Visual Representation of People and relationships

Example syntax of queries and relationship properties

【问题讨论】:

    标签: neo4j cypher visualization


    【解决方案1】:

    这样您可以确保每个电子邮件地址域名都有一个唯一的Company 节点,并将其(通过AT 关系)与每个Person 与该域中的电子邮件地址相关联。域名在存储之前是小写的,以确保唯一性,因为电子邮件地址经常使用不同的大小写。

    MATCH (n:Person)
    MERGE (c:Company {name: TOLOWER(SPLIT(n.slug, '@')[1])})
    CREATE (n)-[:AT]->(c);
    

    注意:上述查询只能执行一次,因为CREATE 子句每次都会创建关系,即使它已经存在。如果需要多次运行查询,可以将CREATE 替换为MERGE

    【讨论】:

    • 谢谢 Sam - 我尝试运行上面的代码并收到 "Neo.ClientError.Statement.SemanticError Cannot merge node using null property value for name" -- 我试图然后将查询的名称更改为 CompanyName MATCH (n:Person) MERGE (c:Company {Companyname: TOLOWER(SPLIT(n.slug, '@')[1])}) CREATE (n)-[:AT]->(c); 但是我收到了相同的响应,现在创建了两个无法使用的关系属性(名称和公司名称) -- 没有新节点在此过程中创建(即没有公司节点)有什么想法吗?
    • 似乎并非所有slug 值都有@ 字符。在进行上述查询之前,您应该清理您的数据以确保所有 slug 值都是有效的电子邮件地址。
    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多