【问题标题】:Find a graph node by a field, update all other fields按字段查找图节点,更新所有其他字段
【发布时间】:2015-05-19 18:08:20
【问题描述】:

我有一个 Neo4J 图形数据库,我想在其中存储用户和他们之间的关系。

我希望能够使用 .Net User 对象中包含的数据更新我通过 GUID 找到它们的用户节点。理想情况下,我想知道如何在 Neo4JClient 中做到这一点,但即使是简单的 Cypher 查询也可以。

理想情况下,我想使用整个对象,不知道哪些属性已被修改,并替换所有属性 - 包括数组属性 - 不像下面的示例,知道要更新 PhoneNumber

类似这样的:

MATCH (n:`User` {Id:'24d03ce7-8d23-4dc3-a13b-cffc0c7ce0d8'}) 
MERGE (n {PhoneNumber: '123-123-1234'})
RETURN n

上面代码的问题是MERGE重新定义了n

我得到这个错误:

n already declared (line 2, column 8) "MERGE (n {PhoneNumber: '123-123-1234'})" ^

【问题讨论】:

    标签: neo4j cypher neo4jclient


    【解决方案1】:
    1. 如果您只想完全替换所有现有节点的属性,请不要使用MERGE。您应该只使用MATCHSET 所有属性。像这样的:

      MATCH (n:`User` {Id:'24d03ce7-8d23-4dc3-a13b-cffc0c7ce0d8'}) 
      SET n = {PhoneNumber: '123-123-1234', Age: 32}
      RETURN n;
      
    2. 另一方面,如果你想创建一个新的节点,如果一个具有指定Id 的节点尚不存在,并且你还想完全替换新节点或现有节点的所有属性,你可以这样做:

      MERGE (n:`User` {Id:'24d03ce7-8d23-4dc3-a13b-cffc0c7ce0d8'}) 
      SET n = {PhoneNumber: '123-123-1234', Age: 32}
      RETURN n;
      

    注意:在上述查询中,n 的所有现有属性将在添加新属性之前被删除。此外,在SET 子句中分配给n 的映射可以作为参数传递给查询(因此不需要硬编码)。

    【讨论】:

    • 我正在寻找的是当我拥有一个完整的用户对象并且我不知道哪些属性已更改并且我不想硬编码所有这些对象的名称时
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2023-03-30
    • 2016-08-02
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多