我已经阅读了Bill Karwin在this帖子上的回答,我惊讶于它如何解决了我一直在使用MySQL进行的家庭树家谱(至少在父子关系或祖辈后代级别)上的基本问题数据库。
与Adjacency List和其他模型相比,它的优势使其成为我的最佳选择。但是,如前所述,不支持为同级节点或外ne节点连接节点。此外,我想将这种原理应用于我的数据库项目
也支持亲戚,外phe,外grand,配偶等的联系。如果可能的话,我想扩展封闭表原则及其查询以支持这种关系。
参考图片(黄色节点是配偶):
Sample Family Tree Structure
具有正确节点连接的查询可以给出答案,例如通过以下方式引用:
(4)至(5):同级
(9)至(2):配偶
(3)至(5):侄子/侄女
(4)至(3)或(6)至(2):叔叔/阿姨
(1)至(9):child妇
(10)至(4):外ne
在这种情况下,当我提到一个节点时,可以说(2),它可以给我相关节点的列表以及它们之间的关系:
(1)是父母
(5)和(4)是孩子
(3)是同级
(9)是配偶
(10)是a子
(6)是外ne /侄女
(8)和(7)是孙子
建立族谱家谱时,还有其他情况,例如同父异母的兄弟姐妹(父对象不同,因此您不能假设这两个节点具有相同的父对象);以及其他诸如“我的配偶和我的兄弟姐妹的配偶”的关系也是-子。还有,我的孩子是我兄弟姐妹的配偶的外ne。
我敢肯定这可以通过“关闭表”完成,但可能不是那么简单。任何文章,建议或疑问都会有很大帮助。谢谢! (也许很久以前有人已经解决了这个问题,我只是找不到合适的资源)。 :)
最佳答案
闭合表对于有向无环图(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
等等。
关于mysql - 使用关闭表的SQL家族树族谱,并支持配偶, sibling ,姻亲, sibling 等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43013720/