我用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的可变长度路径,那么每个人都会得到一行,但没有人没有老板。
我现在不知所措,任何帮助都会很棒!
答案 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