如何创建家庭关系逻辑?

时间:2015-09-21 15:40:52

标签: sql graph neo4j prolog logic

我试图制作this但是尝试使用其他语言。在这种语言中,叔叔和阿姨有不同的名字。我们称父亲阿姨为别的东西,母亲阿姨别的东西。

我遇到了一个图形数据库' neo4j'。我创建了5个成员。我就像我想要的那样使用这种方法。但问题在于我创建了n * (n-1)关系。我在这里创建了一个完整的树,而不仅仅是一个家庭的5个成员。

此外,这更像是蛮力。我创造了所有的可能性。 enter image description here

我正在寻找一种更聪明的方法来做到这一点。创建规则,例如Father's sister = paternal-auntMother's sister = maternal-aunt 我还想查询Father's wife's sister但不想单独定义它们。

3 个答案:

答案 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来绘制家谱树'像这样

enter image description here

从此定义(类型定义仅用于更改节点'颜色)

:- 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' ;