在 Neo4J 中查找具有方向关系重复模式的 N 个级别的路径

tra*_*ton 5 graph family-tree neo4j cypher

我正在尝试使用 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*]->

我希望能够像谱系图一样从第 3 个人一直查询到图表的顶部,而且还可以具体说明需要多少级别(例如 3 代,而不是行尾) 。

我遇到的另一个问题是,如果我没有对诸如 之类的关系指定方向-[:CHILD|FATHER|MOTHER*]-,那么它将从第三个人开始,并朝我想要的方向(交替箭头)走,但也会向下返回连锁寻找所有其他“表兄弟姐妹、阿姨、叔叔等”。

有经验丰富的 Cypher 专家可以帮助我吗?

Bri*_*ood 0

是的,这是一个有趣的案例。我很确定(尽管我愿意纠正)这是不可能的。您有可能同时拥有并维持两者吗?您可以使用简单的密码查询来创建额外的关系:

MATCH (parent)-[:MOTHER|FATHER]->()<-[:CHILD]-(child)
CREATE (child)-[:CHILD_OF]->parent
Run Code Online (Sandbox Code Playgroud)