在结果集中添加另一列,而不是 UNION



我有一组标记为"人"和"城市"的节点。Node citiy 有两个属性 Name 和 isInAustralia。一个人可以与城市节点建立"hasHouse"关系。一个人可以拥有多所房子

我想以这样一种方式检索数据,使其产生格式: 人名 ||澳大利亚城市 ||澳大利亚城市外

假设一个人在澳大利亚的A,D,E市有房子,在澳大利亚以外的B,C市有房子。

我得到的结果是:

亚当----A----B

亚当----D-----B

亚当----E----B

亚当----A-----C

亚当----D----C

亚当----E-----C

我尝试了以下书面查询:

Match(person:Person{Name:"Adam"})-[rel:hasHouseIn]->(city:City) 
where city.isInAustralia="true"
optional match (person:Person{Name:"Adam"})-[rel:hasHouseIn]->
(cityOutside:City) 
where city.isInAustralia="false"
return person.Name,City.Name as CityInAustralia ,cityOutside.Name as 
CityOutsideAustralia

我希望结果是这样的:

名称 ---------- CityInAustralia ---------- CityOutsideAustralia


亚当------------A-----------------------------B


亚当------------D-------------------------C


亚当------------E-------------------------空白

我想得到一个结果,因为我们在sql sever中应用左外部连接时得到的结果,其中Name将是我们将加入的列。

我真的不知道你想做什么 - 查询将无法正常工作,因为你有重复的标识符(rel),所以你什么也得不到。而且 - 如果你有"亚当"在澳大利亚有3个房子(A,D,E),在外面有2个房子(B,C),你会得到:

A --> B
A --> C
D --> B
D --> C
E --> B
E --> C

Neo4j无法确定应该用cityInAustralia显示哪个cityOutside,因为这必须是随机猜测,这似乎是一个后处理工作。将获得我上面指出的结果的查询是:

MATCH (person:Person{Name:"Adam"})-[:hasHouseIn]->(city:City {IsInAustralia:true}) 
OPTIONAL MATCH (person)-[:hasHouseIn]->(cityOutside:City {IsInAustralia:false}) 
RETURN 
person.Name, 
city.Name AS CityInAustralia,
cityOutside.Name AS CityOutsideAustralia

就个人而言,我会使用Collect并获取两个数组,以便您获得:

CityInsideAustralia: [A,D,E], 
CityOutsideAustralia: [B,C]

因此,您每Person只能获得一个结果:

MATCH (person:Person{Name:"Adam"})-[:hasHouseIn]->(city:City {IsInAustralia:true}) 
OPTIONAL MATCH (person)-[:hasHouseIn]->(cityOutside:City {IsInAustralia:false}) 
RETURN 
person.Name, 
COLLECT(DISTINCT city.Name) AS CityInAustralia,
COLLECT(DISTINCT cityOutside.Name) AS CityOutsideAustralia

铌。我正在使用以下数据集:

CREATE 
(p:Person {Name:'Adam'})-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'A'}),
(p)-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'D'}),
(p)-[:hasHouseIn]->(:City {IsInAustralia:true, Name:'E'}),
(p)-[:hasHouseIn]->(:City {IsInAustralia:false, Name:'B'}),
(p)-[:hasHouseIn]->(:City {IsInAustralia:false, Name:'C'})

最新更新