Neo4j 通过属性精确匹配密码

Neo4j 通过属性精确匹配密码,neo4j,cypher,Neo4j,Cypher,假设数据库中有一个节点具有标签L和多个随机属性a=B、C=D等。我想将数据库中的另一个节点也与标签L合并,但只有具有属性a=B 使用当前的Cypher,我可以做一个简单的: merge (node:L {A:B}) return node 但是,由于match/merge考虑具有这些属性的任何节点,因此它将合并到第一个节点中。有没有办法让这个精确匹配?我在考虑做一些类似的事情 merge (node:L {props}) where {props} == {all node's props}

假设数据库中有一个节点具有标签L和多个随机属性a=B、C=D等。我想将数据库中的另一个节点也与标签L合并,但只有具有属性a=B

使用当前的Cypher,我可以做一个简单的:

 merge (node:L {A:B}) return node
但是,由于match/merge考虑具有这些属性的任何节点,因此它将合并到第一个节点中。有没有办法让这个精确匹配?我在考虑做一些类似的事情

merge (node:L {props}) where {props} == {all node's props}

但是,列出所有节点的道具的功能并不存在,尽管它位于节点上。

如果在确定是否存在匹配项时(在创建节点之前)确切知道要排除哪些属性名,可以执行以下操作。在本例中,确定是否存在匹配时要排除的属性为“C”、“D”和“E”


如果节点已创建,则返回值将为
1
,如果未创建,则返回值将为
null

如果您知道要比较的属性,则可以执行此操作

MATCH (node:L {a: "a"}) 
WHERE LENGTH(KEYS(node)) = 1 
WITH (CASE COUNT(node) WHEN 0 then [1] END) AS X 
FOREACH (x in X | create (a:L {a:"a"}));
长度线上的数字必须等于要比较的属性数,在本例中为一

LENGTH(KEYS(node)) = 1 
编辑1-相同的查询,但返回节点
谢谢,但我肯定不知道我想排除的属性,只知道我想包括的属性。只是测试了一下。不知道keys()函数问题:有没有办法像merge函数那样重写它,返回新节点或已在其中的节点?不幸的是,我无法做到这一点。您可以返回X并检查其值。如果节点已创建,则返回[1],如果节点已存在,则返回null。也许有了这些信息,您可以尝试运行另一个查询来获得所需的节点。
LENGTH(KEYS(node)) = 1 
MATCH (node:L {a: "a"}) 
WHERE LENGTH(KEYS(node)) = 1 
WITH (CASE COUNT(node) WHEN 0 then [1] END) AS X 
FOREACH (x in X | create (a:L {a:"a"})) 
with X
MATCH (node:L {a: "a"}) return node;