我正在尝试使用Neo4j分析家谱中的关系。我已经像这样建模了:(p1:Person)-[:CHILD]->(f:Family)<-[:FATHER|MOTHER]-(p2)
我知道我本可以省略家庭标签,而让孩子与每个父母保持联系,但这对我而言并不现实。这是我的图形的示例,黑线是我希望其生成的路径:
我可以用它查询MATCH p=(n {personID:3})-[:CHILD]->()<-[:FATHER|MOTHER]-()-[:CHILD]->()<-[:FATHER|MOTHER]-()-[:CHILD]->()<-[:FATHER|MOTHER]-() RETURN p
但是这种关系有重复的模式。我可以做点什么:MATCH p=(n {personID:3})(-[:CHILD]->()<-[:FATHER|MOTHER]-())* RETURN p
*的含义是重复:CHILD然后是:FATHER | MOTHER关系,而方向不同?显然,如果关系都是相同的方向,我可以使用-[:CHILD|FATHER|MOTHER*]->
我希望能够像系谱图一样从“ Person#3”一直查询到图的顶部,但也要具体确定需要多少级别(例如3代,而不是行尾) 。
我遇到的另一个问题是,如果我不对诸如-[:CHILD|FATHER|MOTHER*]-
之类的关系设置方向,则它将从第3个人开始,并朝我想要的方向(交替箭头)移动,但也会下降沿着链条向下寻找所有其他“表兄弟,阿姨,叔叔等”。
有经验丰富的Cypher专家对我有帮助吗?
最佳答案
我只是在同一个问题上。我发现APOC Expand path procedures只是完成您/我们想要的。
应用于您的示例,您可以使用apoc.path.subgraphNodes
来获取Person#3的所有祖先:
MATCH (p1:Person {personId:3})
CALL apoc.path.subgraphNodes(p1, {
sequence: '>Person,CHILD>,Family,<MOTHER|<FATHER'
}) YIELD node
RETURN node
或者,如果您只希望始祖人最多3代的祖先,则将
maxLevel: 6
添加到配置中(因为1代由2个关系定义,所以3代是6个级别):MATCH (p1:Person {personId:3})
CALL apoc.path.subgraphNodes(p1, {
sequence: '>Person,CHILD>,Family,<MOTHER|<FATHER',
maxLevel: 6
}) YIELD node
RETURN node
如果只希望第三代的祖先,也就是只曾祖父母,也可以指定
minLevel
(使用apoc.path.expandConfig
):MATCH (p1:Person {personId:3})
CALL apoc.path.expandConfig(p1, {
sequence: '>Person,CHILD>,Family,<MOTHER|<FATHER',
minLevel: 6,
maxLevel: 6
}) YIELD path
WITH last(nodes(path)) AS person
RETURN person