按字段查找图节点,更新所有其他字段

Find a graph node by a field, update all other fields

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

我希望能够使用 .Net 用户对象中包含的数据更新我通过 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'})" ^
  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 的映射可以作为参数传递给查询(因此不需要硬编码)。