我有一组标记为Person和City的节点。 Node citiy有两个属性Name和isInAustralia。一个人可以拥有关系&has 39。与City节点的关系。一个人可以有多个房子
我希望以这样的方式检索数据: 人名|| CityInAustralia || CityOutsideAustralia
假设一个人在澳大利亚的A,D,E城市有房子,在澳大利亚以外的城市B,C有房子。
我得到的结果是:
亚当---- A ---- B
亚当---- ----- d乙
亚当---- ----ë乙
亚当---- -----甲ç
亚当---- ---- dç
亚当---- -----ëç
我尝试过以下书面查询:
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
亚当------------甲-----------------------------乙
亚当------------ d -------------------------ç
亚当------------Ë-------------------------空白
我希望得到一个结果,就像我们在sql服务器中应用左外连接时得到的结果,其中Name将是我们将加入的列。
答案 0 :(得分:2)
我并不确切地知道您正在尝试做什么 - 查询无法正常工作,因为您有重复的标识符(rel
),因此您需要这样做。因此得不到任何结果。但是 - 如果你有'亚当'在澳大利亚有3个房子(A,D,E),在外面有2个房子(B,C),你会得到:
A --> B
A --> C
D --> B
D --> C
E --> B
E --> C
Neo4j无法确定 cityOutside
应该与cityInAustralia
显示,因为这必须是一个随机猜测,这似乎是一个后期处理工作。能够为您提供上述结果的查询是:
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
NB。我使用以下数据集:
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'})