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

Neo4j 在结果集中添加另一列而不是UNION,neo4j,cypher,neo4jclient,Neo4j,Cypher,Neo4jclient,我有一组标记为Person和City的节点。节点city有两个属性Name和isInAustralia。个人可以与城市节点建立“hasHouse”关系。一个人可以有多个房子 我希望以这种方式检索数据,使其以以下格式显示: 人员姓名| | cityinastralia | | | CityOutsideAustralia 假设一个人在澳大利亚的a、D、E城市有一所房子,在澳大利亚以外的B、C城市有房子 我得到的结果是: 亚当——A——B 亚当--D--B 亚当——E——B 亚当——A---C 亚当

我有一组标记为Person和City的节点。节点city有两个属性Name和isInAustralia。个人可以与城市节点建立“hasHouse”关系。一个人可以有多个房子

我希望以这种方式检索数据,使其以以下格式显示: 人员姓名| | cityinastralia | | | CityOutsideAustralia

假设一个人在澳大利亚的a、D、E城市有一所房子,在澳大利亚以外的B、C城市有房子

我得到的结果是:

亚当——A——B

亚当--D--B

亚当——E——B

亚当——A---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
我希望结果如下:

名称------澳大利亚城市------澳大利亚城市


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


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


亚当-----------------E-----------------布兰克


我想得到一个结果,就像我们在sql Server中应用左外部联接时得到的一样,其中Name将是我们要联接的列。

我真的不知道您到底想做什么-查询将无法正常工作,因为您有重复的标识符(
rel
),所以您不会得到任何结果。但是,如果你有“亚当”,在澳大利亚有3栋房子(A、D、E),在澳大利亚有2栋房子(B、C),你会得到:

A --> B
A --> C
D --> B
D --> C
E --> B
E --> C
Neo4j无法确定哪个
CityYoutSide
应与
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
就个人而言,我会使用
收集
并获得两个数组,这样您就可以得到:

CityInsideAustralia: [A,D,E], 
CityOutsideAustralia: [B,C]
因此,每个
人只能得到一个结果:

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

我真的不知道您到底想做什么-查询将无法正常工作,因为您有重复的标识符(
rel
),因此您不会得到任何结果。但是,如果你有“亚当”,在澳大利亚有3栋房子(A、D、E),在澳大利亚有2栋房子(B、C),你会得到:

A --> B
A --> C
D --> B
D --> C
E --> B
E --> C
Neo4j无法确定哪个
CityYoutSide
应与
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
就个人而言,我会使用
收集
并获得两个数组,这样您就可以得到:

CityInsideAustralia: [A,D,E], 
CityOutsideAustralia: [B,C]
因此,每个
人只能得到一个结果:

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

您并没有真正说什么是错误的-您得到了什么结果,为什么它是无效的?但在SQL中,左外连接是否也可以这样工作?这难道不会在CityInAustralia和CityYoutSideAustralia的所有价值之间产生笛卡尔乘积吗?在等价的SQL语句中,没有任何语句可以按照您描述的方式将列的结果配对。这里我有一个共同点,但让我们假设我们没有名称,而是SSN(Socail安全编号),您可以提供一个SQL语句来运行以获得该结果吗?我使用@InverseFalcon,我想不出任何方法可以得到您列出的结果-只有我在回答的第一个查询中列出的结果。您并没有说有什么问题-您得到的是什么结果,为什么无效?但在SQL中,左外连接是否也可以这样工作?这难道不会在CityInAustralia和CityYoutSideAustralia的所有价值之间产生笛卡尔乘积吗?在等价的SQL语句中,没有任何语句可以按照您描述的方式将列的结果配对。这里我有一个共同点,但让我们假设我们没有名称,而是SSN(Socail安全编号),您可以提供一个SQL语句来运行以获得该结果吗?我与@InverseFalcon合作,我想不出任何方法可以得到您列出的结果-只有我在回答的第一个问题中列出的结果。感谢@chris的及时回复。是的,我尝试过使用Collect,但我希望结果的格式是我有一行中的城市。我不在乎亚当出现多少次。我想将我的数据转储到excel中,如果我使用Collect,当有成千上万这样的人时,它在单元格中看起来不太好,阅读起来会很枯燥,完全忽略
Collect
位-我补充说,我对您的用例做了假设,我应该清楚:o-我的错!感谢@chris的及时回复。是的,我尝试过使用Collect,但我希望结果的格式是我有一行中的城市。我不在乎亚当出现多少次。我想将我的数据转储到excel中,如果我使用Collect,当有成千上万这样的人时,它在单元格中看起来不太好,阅读起来会很枯燥,完全忽略
Collect
位-我补充说,我对您的用例做了假设,我应该清楚:o-我的错!