【问题标题】:How to create family relation logic?如何创建家庭关系逻辑?
【发布时间】:2015-09-21 15:40:52
【问题描述】:

我正在尝试制作this,但要使用不同的语言。在这种语言中,叔叔和阿姨有不同的名字。我们称姑姑为别的东西,姑姑叫别的东西。

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

此外,这更像是蛮力。我正在创造所有的可能性。

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

【问题讨论】:

    标签: sql neo4j prolog logic graph-theory


    【解决方案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
    

    这将是一个设计问题,您认为哪些是主要关系,哪些是派生的。您可能可以从亲子关系(和婚姻)中获得一切。

    【讨论】:

    • 我的输入将类似于例如。 “父亲妻子妹妹”。其中应归姨母。个人和成员的类结构应该是什么?
    【解决方案2】:

    您不必创建双向关系,也不必创建快捷关系,您只需从另一个方向或跨多个步骤推断信息。

    MATCH path = allShortestPaths((p1:Person {name:"Jane"})-[*]-(p2:Person {name:"John"}))
    RETURN [r in relationships(path) | type(r)] as rels
    

    然后返回 ["husband","father"] 例如为岳父 或 ["mother","sister"] 表示姨妈。

    然后,您可以将这些元组映射到 cypher(使用 case)或您的 python 程序中。

    【讨论】:

    • 双向关系和捷径关系是什么意思?我不是很清楚。你能解释一下或链接我吗?谢谢!
    【解决方案3】:

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

    【讨论】:

    • 如何查询我与“父亲的父亲的女儿”的关系?
    • 主要关系是parent_child/2。我介绍了 female/1 事实,所以我们可以介绍一条规则male(X) :- \+ female(X).。然后,可以计算所有其他关系。即father(Father,Child) :- parent_child(Father,Child), male(Father). 使用否定来定义事实对可计算性有一些影响......
    • 感谢您的回复。欣赏它。但我不是在问如何定义父亲的关系。我的程序的输入可以是任何应该返回祖父的“姐姐的兄弟的父亲的父亲”。如何计算?
    • Prolog 有一个关系数据模型……只要写下连接,它就变成了规则。这种加入需要添加sister/2、brother/2,当然还有father/2
    • 好的,我会调查的。你认为复制this prolog 是个好主意吗?用户可以输入任何内容并返回一个关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多