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

时间:2017-04-11 12:33:19

标签: neo4j cypher neo4jclient

我有一组标记为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将是我们将加入的列。

1 个答案:

答案 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'})