Cypher 匹配属性上的节点,并在结果中包含这些节点之间的关系

Cypher 匹配属性上的节点,并在结果中包含这些节点之间的关系,cypher,Cypher,我有下面的图形模型来表示微服务架构 (:Team{space})-[:OPEX]->(:Service)-[:USES]->[:Service] 团队属于某个空间(部门) 团队拥有多个服务的运营所有权(=运营成本) 服务之间存在使用关系 我的自然语言查询: 找到特定空间中的所有团队,并通过OPEX关系找到他们的所有服务 还包括结果中这些服务之间的所有使用关系 在优雅的Cypher查询中表达此查询时遇到问题。我提出了以下观点,但必须有一种更简单、更自然的表达方式 MATCH (t1:Tea

我有下面的图形模型来表示微服务架构

(:Team{space})-[:OPEX]->(:Service)-[:USES]->[:Service]

  • 团队属于某个空间(部门)
  • 团队拥有多个服务的运营所有权(=运营成本)
  • 服务之间存在使用关系
我的自然语言查询:

  • 找到特定空间中的所有团队,并通过OPEX关系找到他们的所有服务
  • 还包括结果中这些服务之间的所有使用关系
在优雅的Cypher查询中表达此查询时遇到问题。我提出了以下观点,但必须有一种更简单、更自然的表达方式

MATCH (t1:Team {space:"shopping"})-[o1:OPEX]->(s1:Service),
  (t2:Team {space:"shopping"})-[o2:OPEX]->(s2:Service),
  (s3:Service)-[u:USES]->(s4:Service)
WHERE s3.name=s1.name AND s4.name=s2.name
RETURN  t1, o1, s1, u, s2, o2, t2

有人能给我指出一个更好的方向吗?

您应该重用引用同一实例的变量,并且可以使用IN和COLLECT在一组节点中查找模式

像这样的

MATCH (:Team {space:"shopping"})-[:OPEX]->(s:Service)
WITH COLLECT(s) as services
MATCH (t:Team {space:"shopping"})-[o:OPEX]->(s1:Service)
OPTIONAL MATCH (s1:Service)-[u:USES]->(s2:Service)
WHERE s1 in services AND s2 in services
RETURN t, o, s1, u, s2

泰斯拉!这个查询肯定比我原来的SQL查询更像密码。