我有一组标记为"人"和"城市"的节点。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'})