Cypher - 通过其连接节点的属性匹配节点?

Cypher - Match node by properties of its connected nodes?

我们构建了一个 Neo4j 模型,其中每个“实体”节点都链接到一组“属性”节点,每个节点都带有一个“标签”和一个“值”属性。

在给定“标签”/“值”属性的情况下,获取具有所有请求的“属性”邻居的“实体”节点的(最有效的)Cypher 请求是什么?

假设您使用 HAS 关系类型,并传递一个 props parameter,其中包含以下示例格式的所需 label/value 对列表:[['foo', 123], ['bar', true], ['foo', 234], ['baba', 'black sheep']],这个查询应该有效:

MATCH (e:Entity)
WHERE ALL(p IN $props WHERE SIZE([(e)-[:HAS]->(a:Attrib) WHERE a[p[0]] = p[1] | 1]) > 0)
RETURN e

[更新]

返回的 e 节点必须具有相关的 Attrib 节点,其中包含 props 参数中的所有 属性 名称和值对。

A pattern comprehension 必须指定投影,因此此查询仅使用 1 作为投影,因为我们不关心生成列表的内容。我们只关心列表的测试大小。

要使用示例 props 参数值测试上述查询,请首先创建一些合适的节点和关系。例如:

CREATE (e:Entity {id: 1}),
  (e)-[:HAS]->(:Attrib {id: 22, foo: 123, bar: true}),
  (e)-[:HAS]->(:Attrib {id: 33, baba: 'black sheep'}),
  (e)-[:HAS]->(:Attrib {id: 44, foo: 234})

所以我最终创建了以下属性:

:params {props: [["name", "Athanase"], ["age", 22], ["color", "blue"]]}

然后我更新了查询:

MATCH (e:Entity) WHERE ALL(p IN $props WHERE SIZE ([(e)-[:HAS]->(a:Attrib) WHERE (a.label = p[0] AND a.value = p[1]) | 1]) > 0) RETURN e;

看起来工作正常。