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