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