首页 > 解决方案 > 从 neo4j 中的特定标签中搜索

问题描述

我有标签为 a、b、c、d 的节点,我只想从标签“a”和标签“b”中搜索节点“node1”。如果找到“node1”,则返回该节点,否则创建一个标签为“a”的节点。

我试着这样做:

Merge(n {id: "node1"})
on create set n:a
return n

唯一的问题是它会从“a”、“b”、“c”、“d”的标签中搜索,而且非常耗时。

简而言之,这是一个ALLNODESCAN,我只想从标签“a”和“b”中搜索。

标签: python-3.xneo4jpy2neoneo4j-apoc

解决方案


MERGE 不能对多个标签执行此操作。

虽然您可以使用 OPTIONAL MATCHes,然后使用 FOREACH hack 进行 MERGE 以进行条件执行(如果没有具有该 ID 的标签用于标签:A 或:B 的节点),您将无法在FOREACH 中的 MERGEd 节点。

在这里使用APOC 条件程序可能会更好:

OPTIONAL MATCH (n:A {id: "node1"})
OPTIONAL MATCH (m:B {id: "node1"})
WITH coalesce(n, m) as node // returns first non-null value
CALL apoc.do.when(node is null, "MERGE (n:A {id:'node1'}) RETURN n", '', {}) YIELD value
RETURN coalesce(node, value.n) as n

推荐阅读