我已经阅读了Bill Karwin在这篇文章中的回答,我很惊讶它如何解决我一直在研究的家谱家谱的基本问题(至少在亲子关系或祖先 - 后代级别)使用MySQL数据库。 与邻接列表和其他模型相比,它的优势使其成为我项目的绝佳选择。但是,正如所讨论的,不支持为兄弟姐妹或侄子连接节点。此外,我想将这一原则应用于我的数据库项目 还支持姻亲、侄子、孙侄、配偶等的连接。如果可能的话,我想扩展闭包表原则及其查询以支持这种关系。
参考图像(黄色节点是配偶): 示例家谱结构
具有正确节点连接的查询可以给出答案,例如在引用时:
(4)至(5):兄弟姐妹
(9)至(2):配偶
(3)至(5):侄子/侄女
(4) 至 (3) 或 (6) 至 (2):叔叔/阿姨
(1)至(9):儿媳
(10)至(4):侄子岳妇
在这种情况下,当我引用单个节点时,假设(2),它可以为我提供相关节点的列表以及它们之间的关系:
(1) 是父母
(5) 和 (4) 是儿童
(3)是兄弟姐妹
(9) 是配偶
(10)是兄弟姐妹
(6)是侄子/侄女
(8)和(7)是孙子女
在构建家谱家谱时还有其他情况,例如同父异母的兄弟姐妹(父母不同,因此您不能假设这两个节点是否具有相同的父级);以及其他关系,例如"我的配偶和我兄弟姐妹的配偶也是兄弟姐妹。这也表明我的孩子是我兄弟姐妹配偶的侄子岳母)。
我相信这可以通过闭包表来完成,但可能不是那么简单。任何文章或建议或查询都会有很大帮助。谢谢!(也许很久以前就有人已经解决了这个问题,我只是找不到合适的资源)。:)
闭包表对于有向无环图 (DAG) 很有用。但家谱更复杂,DAG的价值有限。我使用过 Neo4j,它支持更复杂的图形,并支持所有祖先或后代的 msec 查询,类似于闭包表。它还支持同级查询:
同胞:
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
等等。