Cypher:搜索满足所有约束的节点

问题描述 投票:0回答:1

我正在尝试编写一个 Cypher 查询,它将返回满足每个指定条件的所有节点集。例如,如果我们有(演员)- [表演] - (电影)、(导演)- [导演] - (电影)和(作曲家)- [COMPOSING_MUSIC] - (电影);并查询如下: 演员1 电影1 导演1 演员2 电影1 导演1 演员2 电影2 导演2 演员1 电影3 导演3 作曲家1

满足上述所有约束的节点集(演员)、(电影)、(导演)、(作曲家)是什么?

我尝试匹配每个边缘

match (a1:Actor)-[:ACTING]-(m1:Movie),
      (a2:Actor)-[:ACTING]-(m1:Movie),
      ...
      (d1:Director)-[:DIRECTING]-(m1:Movie),
      (d2:Director)-[:DIRECTING]-(m2:Movie),
      ...
where a1<>a2 and d1<>d2 ...

但是,这将为我提供与每个匹配语句的交叉匹配。因此,随着每个新的约束,我的结果集将变得更大(而不是更小)。有没有解决这些打字错误问题的规范方法?下一个边缘(约束)应该只在过滤的(之前的)结果中?

谢谢你

cypher graph-databases
1个回答
0
投票

您没有指定关系的方向性,因此我假设您的所有关系都指向

Movie
节点。例如:
(:Actor)-[:ACTING]->(:Movie)

此查询使用 COLLECT 子查询(在 Neo4j 5.6+ 中可用)返回每部电影的演员、导演和作曲家列表:

MATCH (m:Movie)
RETURN m,
  COLLECT{ MATCH (m)<-[:ACTING]-(a) RETURN a } AS actors,
  COLLECT{ MATCH (m)<-[:DIRECTING]-(d) RETURN d } AS directors,
  COLLECT{ MATCH (m)<-[:COMPOSING_MUSIC]-(c) RETURN c } AS composers
© www.soinside.com 2019 - 2024. All rights reserved.