我试图构建一个查询,以获取与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
。
2条答案
按热度按时间h7wcgrx31#
这将返回
p
居住的所有城市的名称列表,以及居住在这些城市中的所有其他人的列表: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”关系)。
因为我们查询目标是
所以我们需要让MATCH模式不那么紧,不知何故,我们需要有这个模式的“可选”侧,即
<-[:LIVED_IN]-(p1:Person)
。我们可以使用密码的“OPTIONAL MATCH”子句。
代码应该是这样的