如何使用 Cypher 创建唯一性
How to use Create Unique with Cypher
我的目标是创建节点 + 设置新的 属性 以防它不存在
如果它存在我只想更新它 属性
试过这个:
MATCH (user:C9 {userId:'44'})
CREATE UNIQUE (user{timestamp:'1111'})
RETURN user
*如果 属性 userId=44 的节点已经存在,我只想将它的 属性 设置为 1111 否则只需创建它并设置它。
我得到的错误:
user already declared (line 2, column 16 (offset: 46))
"CREATE UNIQUE (user{timestamp:'1111'})"
我应该切换到合并还是?
谢谢。
是的,您应该使用 MERGE
语句。
MERGE (user:C9 {userId:'44'})
// you can set some initial properties when the node is created if required
//ON CREATE SET user.propertykey = 'propertyvalue'
ON MATCH SET user.timestamp = '1111'
RETURN user
您提到了独特的限制 - 我假设您已经设置好了。您绝对应该这样做以防止创建重复节点。它还将创建模式索引以提高节点查找的性能。如果您还没有唯一约束,那么可以像这样创建它
CREATE CONSTRAINT ON (u:C9) ASSERT u.userId IS UNIQUE
最后,为了了解您的查询中发生了什么,让我们逐行快速查看一下。
MATCH (user:C9 { userId:'44' })
这与具有 userId
属性 和值 44
的标签 :C9
的节点匹配,并为其分配标识符 user
.
CREATE UNIQUE (user{timestamp:'1111'})
这一行只是试图创建一个没有标签的新节点和一个 属性 timestamp
值为 '1111'
。您看到的异常是由于您使用了已在第一行中使用的相同 user
标识符。但是,这不是使用 CREATE UNIQUE
的受支持方式,因为它首先需要匹配,然后会创建不存在的模式位。这样做的好处是它会停止在图中创建这个不需要的节点 (user{timestamp:'1111'})
。
RETURN user
这一行是不言自明的,没有达到。
编辑
CREATE UNIQUE
以及何时应该使用它似乎有些混乱。这个查询
CREATE UNIQUE (user:C9 {timestamp:'1111'})
将失败并显示消息
This pattern is not supported for CREATE UNIQUE
要使用 CREATE UNIQUE
,您首先要匹配一个现有节点,然后使用它在图中创建一个独特的模式。因此,要创建从 user
到第二个节点的关系,您可以使用
MATCH (user:C9 { userId: '44' }
CREATE UNIQUE (user)-[r:FOO]-(bar)
RETURN r
如果 user
中没有 FOO
类型的关系,则将创建一个新节点来表示 bar
并在两者之间创建 :FOO
类型的关系他们。相反,如果 MATCH
语句不匹配,则不会创建任何节点或关系。
我的目标是创建节点 + 设置新的 属性 以防它不存在
如果它存在我只想更新它 属性
试过这个:
MATCH (user:C9 {userId:'44'})
CREATE UNIQUE (user{timestamp:'1111'})
RETURN user
*如果 属性 userId=44 的节点已经存在,我只想将它的 属性 设置为 1111 否则只需创建它并设置它。
我得到的错误:
user already declared (line 2, column 16 (offset: 46))
"CREATE UNIQUE (user{timestamp:'1111'})"
我应该切换到合并还是?
谢谢。
是的,您应该使用 MERGE
语句。
MERGE (user:C9 {userId:'44'})
// you can set some initial properties when the node is created if required
//ON CREATE SET user.propertykey = 'propertyvalue'
ON MATCH SET user.timestamp = '1111'
RETURN user
您提到了独特的限制 - 我假设您已经设置好了。您绝对应该这样做以防止创建重复节点。它还将创建模式索引以提高节点查找的性能。如果您还没有唯一约束,那么可以像这样创建它
CREATE CONSTRAINT ON (u:C9) ASSERT u.userId IS UNIQUE
最后,为了了解您的查询中发生了什么,让我们逐行快速查看一下。
MATCH (user:C9 { userId:'44' })
这与具有 userId
属性 和值 44
的标签 :C9
的节点匹配,并为其分配标识符 user
.
CREATE UNIQUE (user{timestamp:'1111'})
这一行只是试图创建一个没有标签的新节点和一个 属性 timestamp
值为 '1111'
。您看到的异常是由于您使用了已在第一行中使用的相同 user
标识符。但是,这不是使用 CREATE UNIQUE
的受支持方式,因为它首先需要匹配,然后会创建不存在的模式位。这样做的好处是它会停止在图中创建这个不需要的节点 (user{timestamp:'1111'})
。
RETURN user
这一行是不言自明的,没有达到。
编辑
CREATE UNIQUE
以及何时应该使用它似乎有些混乱。这个查询
CREATE UNIQUE (user:C9 {timestamp:'1111'})
将失败并显示消息
This pattern is not supported for CREATE UNIQUE
要使用 CREATE UNIQUE
,您首先要匹配一个现有节点,然后使用它在图中创建一个独特的模式。因此,要创建从 user
到第二个节点的关系,您可以使用
MATCH (user:C9 { userId: '44' }
CREATE UNIQUE (user)-[r:FOO]-(bar)
RETURN r
如果 user
中没有 FOO
类型的关系,则将创建一个新节点来表示 bar
并在两者之间创建 :FOO
类型的关系他们。相反,如果 MATCH
语句不匹配,则不会创建任何节点或关系。