Neo4j密码查询,用于收集所有中间节点沿着目标节点

aelbi1ox  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(141)

我试图构建一个查询,以获取与person p居住在同一个城市的所有人,我还想获取person p居住过的所有城市名称。
但是这个查询:

MATCH (p:Person)-[:LIVED_IN]->(c:City)<-[:LIVED_IN]-(p1:Person)
WERE p.id = 0
RETURN p1, collect (DISTINCT c.name) AS cities

只返回每个p1人也居住过的城市名称。
假设人p住在两个城市,而人p1只住在其中一个城市。我只会得到一个城市的结果。我期待得到不同城市的所有结果在一个变量,沿着列表p1人.
如果我使用UNWIND操作来遍历城市并收集所有不同的城市名称,我将丢失变量p1

h7wcgrx3

h7wcgrx31#

这将返回p居住的所有城市的名称列表,以及居住在这些城市中的所有其他人的列表:

MATCH (p:Person)-[:LIVED_IN]->(c:City)
WHERE p.id=0
OPTIONAL MATCH (c)<-[:LIVED_IN]-(p1:Person)
WHERE p1 <> p
RETURN COLLECT(DISTINCT c.name) as cities, COLLECT(DISTINCT p1) AS otherPeople
7kqas0il

7kqas0il2#

这里的问题来自MATCH子句<-[:LIVED_IN]-(p1:Person)的这一部分,我们通常使用'MATCH'子句来设置一个固定的结构/模式,以便使用它查询我们的图,并开始匹配,直到找到匹配'MATCH'子句中的结构(如果存在)。
在这种情况下,MATCH子句被指定为MATCH (p:Person)-[:LIVED_IN]->(c:City)<-[:LIVED_IN]-(p1:Person),这意味着去寻找精确匹配“使用“LIVED_IN”关系/边连接到城市节点‘c’的人节点‘p’并且这个城市必须具有至少另一个人节点‘p1’而不是第一个人节点‘p’生活在其中”的模式,这导致仅由人‘p’居住的每个“城市”将不包括在内,因为这与我们设置的指定模式不匹配。
在图论中,
给定模式将仅找到特定“LIVED_IN”关系的度值至少为2的城市,其中一个城市是我们的起始人节点“p”和任何其他节点,这产生了问题,因为我们需要“获得人p居住的所有城市名称”,其中一些城市节点“c”的度值可能仅为1(只有人p与之建立“LIVED_IN”关系)。
因为我们查询目标是

  • 我想得到p居住的所有城市的名字。
  • 得到与人p居住在同一城市的所有人(如果存在具有LIVED_IN关系/边的公共城市节点)。

所以我们需要让MATCH模式不那么紧,不知何故,我们需要有这个模式的“可选”侧,即<-[:LIVED_IN]-(p1:Person)
我们可以使用密码的“OPTIONAL MATCH”子句。
代码应该是这样的

MATCH (p:Person)-[:LIVED_IN]->(c:City)
WHERE p.id = 0
OPTIONAL MATCH (c)<-[:LIVED_IN]-(other:Person)
WHERE other <> p
RETURN COLLECT(DISTINCT other.name) AS people , COLLECT(DISTINCT c.name) as cities

相关问题