Cypher 按属性精确匹配

Cypher match exactly by properties

假设我在数据库中有一个带有标签 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}

但是列出所有节点道具的功能并不存在,尽管它在他们的top five ideas

如果您确切知道在确定是否存在任何匹配项时(在创建节点之前)要排除哪些 属性 个名称,则可以执行类似以下操作。在此示例中,确定是否存在匹配时要排除的属性是 "C"、"D" 和 "E".

OPTIONAL MATCH (node:L {A: "B"})
WHERE NOT (has(node.C) OR has(node.D) OR has(node.E))
WITH (CASE WHEN node IS NULL THEN [1] ELSE [] END) AS cn
FOREACH (x IN cn | CREATE (:L {A: "B"}))
RETURN cn[0];

如果节点已创建,则返回值为 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 行中的数字必须等于您要比较的属性数,在本例中为一个。

LENGTH(KEYS(node)) = 1 

编辑 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;