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

在Neo4j中组合两个不同的密码查询的结果,neo4j,cypher,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) WH

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

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

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

此查询应返回感兴趣的
人,以及他的
父母
兄弟姐妹
子女的集合(可能为空)

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;
MATCH(p:Person{Person\u of_interest:'y'})
可选匹配(p)(同胞:人)
sib p在哪里
可选匹配(p)-[:HAS_CHILD]->(kid:Person)
回来
P
收集(不同的父项)作为父项,
将(不同的同胞)收集为同胞,
收集(儿童)作为儿童;
该查询假设
具有\u CHILD
关系类型用于表示父子关系


为了加快查找感兴趣的人,您应该在
:person(person\u of_interest)
上创建一个or。此查询应该返回感兴趣的
person
,以及(可能是空的)他的以下集合:
父母
兄弟姐妹
子女

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;
MATCH(p:Person{Person\u of_interest:'y'})
可选匹配(p)(同胞:人)
sib p在哪里
可选匹配(p)-[:HAS_CHILD]->(kid:Person)
回来
P
收集(不同的父项)作为父项,
将(不同的同胞)收集为同胞,
收集(儿童)作为儿童;
该查询假设
具有\u CHILD
关系类型用于表示父子关系


为了加快找到感兴趣的人,您应该在
:person(person\u of\u interest)

上创建一个or,我将在p和parent之间的第一次匹配中假设关系的方向是从父到子向下?对于无向关系,您要将父对象与p的父对象和子对象(或与人指向的任何其他关系)进行匹配。此外,对于输出,您是否需要一个列来收集父对象,以及一个单独的列来收集子对象?或者您希望一个列同时包含父项和所有子项(如果存在)?还是别的什么?如果您提供所需的查询输出,它将帮助我们提供更有用的解决方案。#1是的,我可以将箭头放在那里,使方向更清晰。在我的例子中,它不会因为我的图表的设置而改变任何东西,但感谢您的观察。#2对所需输出的良好调用。我会继续,我会假设在你的第一场p和父母的匹配中,关系的方向是从父母到孩子的向下?对于无向关系,您要将父对象与p的父对象和子对象(或与人指向的任何其他关系)进行匹配。此外,对于输出,您是否需要一个列来收集父对象,以及一个单独的列来收集子对象?或者您希望一个列同时包含父项和所有子项(如果存在)?还是别的什么?如果您提供所需的查询输出,它将帮助我们提供更有用的解决方案。#1是的,我可以将箭头放在那里,使方向更清晰。在我的例子中,它不会因为我的图表的设置而改变任何东西,但感谢您的观察。#2对所需输出的良好调用。我会继续的。你上一次的编辑真的让一切都融为一体了。现在,输出是密钥对的列表。这太棒了。从现在起,我将把它作为我很多工作的基础。非常感谢你!!你上一次的编辑真的把它整合在一起了。现在,输出是密钥对的列表。这太棒了。从现在起,我将把它作为我很多工作的基础。非常感谢你!!