Cypher每场比赛返回多行

时间:2017-09-10 20:07:39

标签: neo4j cypher

我用cypher查询neo4j,每次匹配得两行:

MATCH (g:Group {Name: "Goliath_Treasury237"})-[w:MEMBER]->(a:Account)<-[y:ACCOUNT]-(p:Person)-[MANAGER*0..1]->(b:Person) 
WHERE NOT p.staffID = b.staffID 
MATCH (g:Group {Name: "Goliath_Treasury237"})-[j:MEMBER]->(v:Account)<-[x:ACCOUNT]-(p:Person)-[f:DEP*0..1]->(d:Department) 
RETURN  p.GivenName, p.Surname, p.staffID, p.CorpT, b.staffID, d.Name

我正试图获得一个人的部门和老板的信息,除非我进行双重匹配,否则我将以声明的方式努力。这会为每个匹配返回两行,其中一个人拥有一个老板,一个人的ID为他们的老板ID,另一个人拥有正确的老板ID。对于没有老板的人,我会退回一排,但老板的身份是他们自己的。

如果我删除boss的可变长度路径,那么每个人都会得到一行,但没有人没有老板。

我现在不知所措,任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

我们可以在这里解决几件事。

首先,您不需要从头开始重新开始第二场比赛,您可以重复使用相同的p节点而无需之前的所有内容。如果您不打算以某种方式使用或返回它,您也不需要在每个节点和关系上都有变量。

当您不希望匹配过滤掉行时,您可以使用OPTIONAL MATCH,如果匹配失败,OPTIONAL MATCH中新引入的变量将为null。

这样的事情应该有效:

MATCH (:Group {Name: "Goliath_Treasury237"})-[:MEMBER]->(:Account)<-[:ACCOUNT]-(p:Person)
OPTIONAL MATCH (p)-[MANAGER]->(b:Person) 
WHERE NOT p.staffID = b.staffID 
OPTIONAL MATCH (p)-[:DEP]->(d:Department) 
RETURN  p.GivenName, p.Surname, p.staffID, p.CorpT, b.staffID, d.Name
相关问题