【问题标题】:SQL Family Tree genealogy using Closure Table with support for spouse, sibling, in-laws, niblings, etc使用闭包表的 SQL 家谱,支持配偶、兄弟姐妹、姻亲、兄弟姐妹等
【发布时间】:2017-08-18 05:33:00
【问题描述】:

我已经阅读了 Bill Karwin 在 this 帖子上的回答,我很惊讶它如何解决了我一直在研究的家谱系谱中的基本问题(至少在亲子关系或祖先-后代层面) ) 使用 MySQL 数据库。 与邻接列表和其他模型相比,它的优势使其成为我的项目的绝佳选择。但是,正如所讨论的,不支持为兄弟或侄子连接节点。此外,我想将这样的原则应用于我的数据库项目 还支持姻亲、侄子、侄孙、配偶等的连接。如果可能,我想扩展 Closure Table 原则及其查询以支持这种关系。

参考图片(黄色节点为配偶): Sample Family Tree Structure

具有正确节点连接的查询可以给出答案,例如引用时:

  1. (4) 到 (5):同级

  2. (9) 到 (2):配偶

  3. (3) 到 (5):侄子/侄女

  4. (4) 到 (3) 或 (6) 到 (2):叔叔/阿姨

  5. (1) 至 (9):儿媳

  6. (10) 到 (4):侄子

在这种情况下,当我提到单个节点时,比如说 (2),它可以为我提供相关节点的列表以及它们如何相互关联:

  1. (1) 是父级

  2. (5) 和 (4) 是孩子

  3. (3) 是同级

  4. (9) 是配偶

  5. (10) 是姐夫

  6. (6) 是侄子/侄女

  7. (8) 和 (7) 是孙子

在构建家谱系谱时还有其他场景,例如半兄弟姐妹(父节点不同,因此您不能假设这两个节点具有相同的父节点);和其他关系,例如“我的配偶和我兄弟姐妹的配偶也是兄弟姐妹”。这也表明我的孩子是我兄弟姐妹的配偶的侄子)。

我确信这可以通过 Closure Table 完成,但可能不是那么简单。任何文章或建议或查询都会有很大帮助。谢谢! (也许很久以前有人已经解决了这个问题,我只是找不到合适的资源)。 :)

【问题讨论】:

    标签: mysql family-tree transitive-closure-table genealogy


    【解决方案1】:

    闭包表对于有向无环图 (DAG) 很有用。但家谱更为复杂,DAG 的价值有限。我使用了 Neo4j,它支持更复杂的图形,并启用类似于闭包表的所有祖先或后代的毫秒查询。它还支持同级查询:

    兄弟姐妹:

    match p=(n:Person{RN:1})-[:father|mother]->(m) match (m)<-[:father|mother*..1]-(s) return distinct n.RN,s.RN,s.fullname
    

    兄弟姐妹

    match p=(n:Person{RN:1})-[:father|mother*..2]->(m) where length(p)=1
    match q=(m)<-[:father|mother*..1]-(s) where length(q)=1 
    match (s)<-[:husband|wife]-(t) return distinct n.RN,s.RN,s.fullname,t.RN,t.fullname
    

    阿姨和叔叔

    match p=(n:Person{RN:1})-[:father|mother*..2]->(m) where length(p)=2
    match q=(m)<-[:father|mother*..1]-(s) where length(q)=1 return distinct n.RN,s.RN,s.fullname
    

    堂兄弟

    match p=(n:Person{RN:1})-[:father|mother*..3]->(m) where length(p)=2
    match q=(m)<-[:father|mother*..3]-(s) where length(q)=2 return distinct n.RN,s.RN,s.fullname
    

    堂兄弟

    match p=(n:Person{RN:1})-[:father|mother*..4]->(m) where length(p)=3
    match q=(m)<-[:father|mother*..4]-(s) where length(q)=3 return distinct n.RN,s.RN,s.fullname
    

    等等。

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多