【问题标题】:Cypher query creating new nodes instead of building relationship with existing nodesCypher 查询创建新节点而不是与现有节点建立关系
【发布时间】:2020-07-09 04:35:33
【问题描述】:

我目前有一个在 Men 节点和 People 节点之间建立关系的查询:

MATCH (m:Mem)
UNWIND m.personID as person
MERGE (p:Person{personID:person})
MERGE (m)-[:WITH]->(p)

Mem 节点包含一个 PersonID 数组,我正在展开这些数组,然后将其与具有相应 PersonID 的 Person 节点匹配。但是,查询正在与它创建的 new 个人节点建立关系,只使用相应的 personIDs 属性(没有其他属性),而不是与 new em>现有具有相应 personID 的 Person 节点。

即使我对带有 Person 标签的节点的 personID 属性有唯一约束,也会发生这种情况。

如何编写一个查询来建立关系但不创建具有相应 personID 的新节点?

【问题讨论】:

  • 由于您使用MERGE(而不是CREATE)作为Person 节点,如果没有具有相同@987654326 的节点,您只会创建一个新的Person 节点@ 价值。您需要检查为什么预期的Person 节点不存在。
  • 好的 - 我想我已经解决了。当我展开 Mems 属性数组时,personID 是 strings 但在现有的 Person 节点上,personID 是 integers,所以当它进行合并时,它会创建具有相应 personID 的新节点作为 strings 而不是创建与 personID 为 integers 的现有节点的关系。所以我需要弄清楚如何在展开时将数组中的值设置为 integers 而不是将它们保留为 strings

标签: neo4j cypher


【解决方案1】:

由于现有节点将personID存储为整数,您需要通过TOINTEGER()函数将person字符串值转换为整数:

MATCH (m:Mem)
UNWIND m.personID as person
MERGE (p:Person {personID: TOINTEGER(person)})
MERGE (m)-[:WITH]->(p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多