我有一个家谱图。有几个我感兴趣的人,看看他们的直系亲属是谁。我有一个很好的查询,将返回一个感兴趣的人的兄弟姐妹:
MATCH (p:Person)-[]-(parent:Person)-[]->(parents_kids:Person)
WHERE p.`person_of_interest` = 'y'
RETURN p, parent, parents_kids
;
我也可以归还一个有兴趣的人的孩子:
MATCH (p:Person)-[]->(children:Person)
WHERE p.`person_of_interest` = 'y'
RETURN p, children
;
这些查询可以单独使用,但如何将结果一起返回?
问题在于,有时候,感兴趣的人在数据库中没有孩子。另一方面,有时感兴趣的人没有父母在数据库中。所以我不能写一个查询来匹配这两种情况。
我想要一个简单的表格......我正在考虑这样的事情:NULL
值适当的地方:
| person_of_interest | silblings | children |
|--------------------|-----------|----------|
| | | |
| | | |
如果不清楚,我当然可以用一个可重复性最小的例子来修改这个问题。谢谢!
答案 0 :(得分:3)
此查询应返回其感兴趣的Person
及其parents
,siblings
和children
的(可能为空)集合。
MATCH (p:Person {person_of_interest: 'y'})
OPTIONAL MATCH (p)<-[:HAS_CHILD]-(parent:Person)
OPTIONAL MATCH (parent:Person)-[:HAS_CHILD]->(sib:Person)
WHERE sib <> p
OPTIONAL MATCH (p)-[:HAS_CHILD]->(kid:Person)
RETURN
p,
COLLECT(DISTINCT parent) AS parents,
COLLECT(DISTINCT sib) AS siblings,
COLLECT(kid) AS children;
该查询假定HAS_CHILD
关系类型用于表示父子关系。
要加快找到感兴趣的人,您应该在:Person(person_of_interest)
上创建index或unique constraint。