结合Neo4j中两个不同的密码查询的结果

时间:2016-09-02 00:59:46

标签: neo4j cypher

我有一个家谱图。有几个我感兴趣的人,看看他们的直系亲属是谁。我有一个很好的查询,将返回一个感兴趣的人的兄弟姐妹:

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 |
|--------------------|-----------|----------|
|                    |           |          |
|                    |           |          |

如果不清楚,我当然可以用一个可重复性最小的例子来修改这个问题。谢谢!

1 个答案:

答案 0 :(得分:3)

此查询应返回其感兴趣的Person及其parentssiblingschildren的(可能为空)集合。

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)上创建indexunique constraint