我试图制作this但是尝试使用其他语言。在这种语言中,叔叔和阿姨有不同的名字。我们称父亲阿姨为别的东西,母亲阿姨别的东西。
我遇到了一个图形数据库' neo4j'。我创建了5个成员。我就像我想要的那样使用这种方法。但问题在于我创建了n * (n-1)
关系。我在这里创建了一个完整的树,而不仅仅是一个家庭的5个成员。
我正在寻找一种更聪明的方法来做到这一点。创建规则,例如Father's sister = paternal-aunt
和Mother's sister = maternal-aunt
我还想查询Father's wife's sister
但不想单独定义它们。
答案 0 :(得分:1)
您可以创建建立规则的函数,例如:
def is_maternal_aunt(individual, member):
return member in individual.mother.sister
这些可以是任意复杂的:
def is_maternal_aunt(individual, member):
return is_sister(individual.mother, member)
def is_sister(individual, member):
return individual.mother == member.mother
这将是您认为是主要关系并且派生出来的设计问题。你可以从父母子女关系(和婚姻)中得到所有东西。
答案 1 :(得分:1)
您不必创建双向关系,也不必创建快捷关系,您只需在其他方向或跨多个步骤推断信息。
MATCH path = allShortestPaths((p1:Person {name:"Jane"})-[*]-(p2:Person {name:"John"}))
RETURN [r in relationships(path) | type(r)] as rels
然后返回["丈夫","父亲"],例如为岳父岳母 或["母亲","姐姐"]为一位产妇姨妈。
然后,您可以将这些元组映射到cypher(使用case
)或python程序中。
答案 2 :(得分:1)
Prolog是一个合理的选择...例如,我有small library来绘制家谱树'像这样
从此定义(类型定义仅用于更改节点'颜色)
:- module(elizabeth, [elizabeth/0]).
:- use_module(genealogy).
elizabeth :- genealogy(elizabeth, 'Elizabeth II Family').
female('Elizabeth II').
female('Lady Elizabeth Bowes-Lyon').
female('Princess Mary of Teck').
female('Cecilia Cavendish-Bentinck').
parent_child('George VI', 'Elizabeth II').
parent_child('Lady Elizabeth Bowes-Lyon','Elizabeth II').
parent_child('George V', 'George VI').
parent_child('Princess Mary of Teck', 'George VI').
parent_child('Cecilia Cavendish-Bentinck','Lady Elizabeth Bowes-Lyon').
parent_child('Claude Bowes-Lyon', 'Lady Elizabeth Bowes-Lyon').
它需要SWI-Prolog和Graphviz。
编辑添加一些事实
female('Rose Bowes-Lyon').
parent_child('Cecilia Cavendish-Bentinck','Rose Bowes-Lyon').
parent_child('Claude Bowes-Lyon', 'Rose Bowes-Lyon').
和规则
is_maternal_aunt(Person, Aunt) :-
parent_child(Parent, Person),
female(Parent),
parent_child(GranParent, Parent),
parent_child(GranParent, Aunt),
Aunt \= Parent.
我们得到了
?- is_maternal_aunt(X,Y).
X = 'Elizabeth II',
Y = 'Rose Bowes-Lyon' ;