Как создать логику семейных отношений?

Я пытаюсь сделать это но для другого языка. В этом языке есть разные имена для дядей и теток. Мы называем тетю по отцовской линии как-то иначе, а тетю по материнской линии как-то иначе.

Я наткнулся на графовую базу данных neo4j. Я создал 5 участников. Я получил этот подход к работе так, как я хочу. Но проблема в том, что я должен создать отношения n * (n-1). Я создаю здесь полное дерево, а не только 5 членов семьи.

Кроме того, это больше похоже на грубую силу. Я создаю все возможности. введите здесь описание изображения

Я ищу более разумный способ сделать это. Создание правил, таких как, например, Father's sister = paternal-aunt и Mother's sister = maternal-aunt Мне также нужны запросы Father's wife's sister, но я не хочу определять их отдельно.


person Pranav    schedule 21.09.2015    source источник


Ответы (3)


Вы можете создавать функции, которые устанавливают правила, например:

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

Это будет вопрос дизайна, для которого вы считаете первичными отношения, а какие производными. Вы, вероятно, можете вывести все из отношений родителей и детей (и брака).

person AChampion    schedule 21.09.2015
comment
Мой ввод будет чем-то вроде, например. отец жена сестра. Которая должна вернуть тетю по материнской линии. Какой должна быть классовая структура индивидуума и члена? - person Pranav; 22.09.2015

Вам не нужно создавать двунаправленные отношения, и вам также не нужно создавать короткие отношения, вы можете просто вывести информацию в другом направлении или через несколько шагов.

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

который затем вернет ["муж","отец"], например. для тестя или [«мать», «сестра»] для тети по материнской линии.

Затем вы можете сопоставить эти кортежи либо в шифровании (с case), либо в вашей программе на Python.

person Michael Hunger    schedule 21.09.2015
comment
Что вы подразумеваете под двунаправленными отношениями и короткими отношениями? Я не очень понимаю. Можете ли вы объяснить или связать меня с чем-то? Спасибо! - person Pranav; 24.09.2015

Пролог - разумный выбор... Например, у меня есть эта небольшая библиотека рисовать "генеалогические деревья" вот так

введите здесь описание изображения

из этого определения (определения жанра используются только для изменения цвета узла)

:- 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' ;
person CapelliC    schedule 22.09.2015
comment
Как я могу запросить что-то вроде моего отношения к «дочери отца отца»? - person Pranav; 24.09.2015
comment
Основное отношение — parent_child/2. Я представил факты о женщине/1, поэтому мы могли ввести правило male(X) :- \+ female(X).. Затем можно вычислить любое другое отношение. то есть father(Father,Child) :- parent_child(Father,Child), male(Father). Использование отрицания для определения фактов имеет некоторые последствия для вычислимости... - person CapelliC; 24.09.2015
comment
Спасибо за ответ. Ценить это. Но я не спрашиваю, как определить отношения для отца. Ввод моей программы может быть чем угодно, например, «отец отца брата сестры», который должен вернуть дедушку. Как это вычислить? - person Pranav; 24.09.2015
comment
Пролог имеет реляционную модель данных... просто запишите соединение, и оно станет правилом. Такое объединение потребует добавления сестры/2, брата/2 и, конечно же, отца/2. - person CapelliC; 24.09.2015
comment
Хорошо, я посмотрю на это. Как вы думаете, для репликации этого Пролог это хорошая идея? Пользователь может ввести что угодно, и он вернет отношение. - person Pranav; 24.09.2015
comment
Я не знаком с Wolfram Alpha, поэтому не могу быть уверен... Пролог предназначен для вычисления логики, и, конечно, он не содержит ничего. Представление знаний и вычислимость имеют прочные и сложные взаимосвязи... Обычно мы ищем ответы, не так ли? а затем мы применяем наши знания о мире... - person CapelliC; 24.09.2015
comment
Можете ли вы взглянуть на это? - person Pranav; 24.09.2015
comment
@RaghavSharma: ответ, который вы там получили, все в порядке ... применяется реляционное исчисление. Как я уже сказал выше, его модель данных является реляционной, с ограниченной поддержкой, например, арифметики, которая громоздка при выражении в чисто реляционной форме. - person CapelliC; 24.09.2015
comment
Ладно, спасибо, чувак! Я достаточно вас побеспокоил. Я возьму это отсюда. - person Pranav; 24.09.2015