... помощь Мегамозга. По сути продолжение темы http://www.drupal.ru/node/52584
Сайт который я построил на основе модуля генмод конкретно начал грузить запросами - что само по себе говорит об интересе людей к генеалогии. Я получал много писем где меня просили максимально упростить процесс внесения особи в ячейку генеалогического дерева.
И вот, после очередного посещения злачного заведения, мои друзья упросили меня таки занятся этим вопросом )) Но я пока не могу себе представить как мне построить генеалогическое дерево. Каждая осоюбь имеет маму и папу. У мамы дети от разных пап и у пап дети от разных мам. Таксономия Друпала должна справиться с этим развратом - но пока я не знаю как это сделать. Это очень серьезно и интересно.
Комментарии
Петя Супермен?
Федя. По делу пожалуста.
Федя. По делу пожалуста.
очень сомневаюсь что таксономия справится . недавно обдумывал похожую задачку, похоже на то что нужно заходить со стороны взаимосвязанных полей . причОм каждое заполненное поле должно инициировать создание дополнительных одноименных нод с заполняемыми полями в соответствии с этими самыми взаимосвязями (сын-отец, отец-сын, брат-сестра, и т.д.). То есть создаем ноду Иванов Иван Иванович в которой есть поле жена -- Иванова (Пыжикова) Мария Ивановна и поле сын -- Иванов Федор Иванович . При сохранении инициируется создание (не факт что создаются) нод Иванова (Пыжикова) Мария Ивановна и Иванов Федор Иванович с соответствующими записями в полях муж, сын, отец, мать . Сразу возникает казалось бы множество вопросов, но если хорошенько подумать то все можно разрешить. это надо разрабатывать и скорее всего писать модуль. для начала наверное под cck (свои взаимосвязи + куда-то писать связи обратные).
А вы попробуйте гипперграф, язык описания теории графов. Ведь по сути что такое генеология - графы, вот и поставьте себе обыкновенный редактор с поддержкой соответствующих фильтров (graphviz_filter).
Пробовалд сам, но давно, вот что осталось в памяти:
Установить graphviz-2.24.msi - Graphviz Tools Package
Скопировать C:\Program Files\Graphviz2.24\bin\dot.exe
в \usr\local\bin\dot.exe
Скопировать php_rar.dll в \usr\local\PHP\ext
Скопировать Image_GraphViz-1.2.1.tgz в \usr\local\PHP
Выполнить:
pear install Image_GraphViz-1.2.1.tgz
Развернуть модуль graphviz_filter-6.x-1.4.tar.gz
..........
Окружить DOT syntax между [graphviz]...[/graphviz] тегами
........................
Таким образом в обычном редакторе пользователь по простейшим правилам списком пишет всех своих родственников и через тире с комментариями, затем заковычивает это фильтрами [graphviz]...[/graphviz], нажимает сохранить, - и видит красивый такой граф со всеми связями, комментариями и прочим.
Правда,для поддержки таких фильтров надо чтоб хостер поддержку разрешил(процесс у себя запустил), поэтому я эту тему отложил. Но если вы заинтересуетесь, то будет здорово. По этой теме я здесь до сих пор ничего не встречал, а её стоило бы раскрутить
Люди иногда занимаются такими вещами как расторжение брака и усыновление детей (+ институт опекунства).
им зачот, да
да . потому и поля. один родитель есть, это собственно нода (плюс похоже на то этого родителя нужно дублировать из титла в какое-нибудь скрытое поле в самой ноде), второй родитель может быть привязан к каждому полю потомка отдельно .
C другой стороны, генеалогия подразумевает биологическое родство
т.е. ей (генеалогии) должно быть фиолетово на социальные отношения нод.
У каждой ноды должно быть 2 родителя (вроде по-другому детей делать пока не умеют?*)
Например, таксономия - это xml, у которого по определению 1 родитель и n потомков.
Если делать на таксономии, то наверное придерживаться матриархата,
ибо кобелиЕсли с 2 родителями - навскидку несколько вопросов:
- зачатие через пробирку
- суррогатная мать
- родители анонимусы
- апдейт родства после тестов ДНК
* - клонирование
Хотелось бы средствами друпала если это возможно. И еще задача не просто вписать родственников и построить графом дерево. Надо чтоб строилась генеалогическая связь. По сути должно быть одно большое дерево - от Адама и Евы - но так как это невозможно и нереально то будет много кусков этого дерева которые гипотетически всеравно имеют связь между собой. Может я не в том направлении рассуждаю но пока так. С нодами и полями тоже мысль закрадывалась но я на нее особо не обратил внимание - подумал что таксаномия и ее древовидная структура самое оно. Спасибо за наводку - может действительно на нодах.
Так и у мамки от разных отцов дети - так что сути не меняет. Может папку сделать нодой а мамку полем таксономии?))Если без шуток - спасибо за мысли - может что-то придумаем вместе.
Да - на первый взгляд сложно.
По сути надо дать пользователю заполнить ячейки генеалогического дерева - это я так рассуждал.
Генеалогия это дерево которое имеет структуру где каждая веточка делится на две веточки - папу и маму. Если бы такую структуру дерева можно было бы задать в таксономии и разрешать пользователю каким-то образом вписывать имена этих веточек - по сути терминов таксономии - то мне кажется это тоже был бы вариант.
как-то она совсем таксономия для этого не подходит . образно выражаясь - я могу себе легко представить как с помощью таксономии описать конструкцию каркаса деревянной крыши - где подкосы где прогоны где левые где правые которая по счету снизу. деревянный каркас - да. живое дерево - нет.
в общем нам нужно описать объект - какую-то личность в комплексе его ближайших родственников, условно в рамках семьи. это будет являться отдельной нодой где титл и описание для собственно личности, а дополнительные поля - для родственников. все подкомпоненты внутри этого объекта (семьи) имеют понятные взаимосвязи . парные связи . отец-сын, сын-отец. Но и каждый подкомпонент является отдельным объектом со своими подкомпонентами, причем большая часть этих подкомпонентов может заимствовать вторую часть парной связи, то есть большинство необходимых к заполнению полей может заполняться автоматически.
Ну мамку надо тоже делать нодой, ибо гендерная дискриминация.
Причем отцовские и материнские ноды должны быть разных типов - однополые родители не могут зачать.
И сразу предусмотреть смену пола.
скорее наоборот: две веточки папа-мама образуют веточку-потомок, которая в свою очередь...
Да - это хорошо. Не знаю правильно ли я вас понял. У каждой особи отдельная нода. В ноде 6 полей node reference - 1.папа 2.мама 3.дед 4.бабка.5.дед 6.бабка.
Создаю ноду - вписываю в поля папу и маму. Как сделать автоматическое заполнение полей дед и бабка? И задача будет почти в кармане.
у каждой особи может быть только один отец и одна мать. у жены (или у разных жен) - свои мать и отец . что вводится/выводится на соответствующих нодах, в первую очередь. как выводить на ноде еще и бабущек/дедушек и со стороны отца и со стороны матери - вопрос наверное больше технический, пока не сделать основной (грубо) каркас - сложно сказать как это лучше сделать.
Спасибо - хорошая идея.
Как апдейтить дедку-бабку, если тест ДНК покажет, что папаша-то не торт?
Имхо, дедки-бабки не нужны - они вычисляются в процессе выборки
подкосов и прогоновиз дерева.Вот я создаю ноду - в полях родителей - ставлю папу и маму.Дальше идут поля бабушек - ессественно они должны заполнятся автоматом. Вопрос как это сделать.
Вот в том то и вопрос - как это сделать технически. Каркас понятен если грубо - ноды и поля в которые вносим названия нод родительских. Родословная с одним коленом готова. Теперь технически необходимо вытащить через родителей поля бабушек и дедушек. Потом через них уже вытаскивать третье колено. И так далее. Ничего кроме как привязки к таксономии в голову пока не приходит.
Ну, node refrence тут некошерно, имхо.
Т.е. класс child должен иметь метод
get_parent($sex = 'both')
и в рекурсию его.-- Каркас понятен если грубо - ноды и поля в которые вносим названия нод родительских. --
но у нас может и не быть "родительских" нод перед созданием (сохранением) какой-то ноды. вообще . или один юзверь начнет с Петровых а другой с Сидоровых , а петровы и сидоровы двоюродные братья. поэтому такой простой путь ничего не дает . только создание новой ноды с какими-то полями , между полями взаимосвязи. на основе данных полей могут формироваться другие ноды с аналогичными или обратными полями.
под взаимосвязями пока наверное нет смысла подразумевать использование node reference . это все еще пока не ясно .
может быть нужен какой-то особый модулечек под cck в том числе
К примеру - гражданин N повстречал гражданку M, после чего та понесла.
Гражданин N, немного поразмыслив, решил что "это не его" и сменил пол.
Что будет записано у потомка N+M? Две матери?
имхо, это поле, усеянное разнокалиберными граблями.
На самом деле - есть более глобальная проблема восприятия потомками своих родителей.
К примеру, нередко родители-анонимусы на старости лет находят своих биологических потомков с целью погреть кости.
Потомки же выпиливают своих биологических родителей со словами "мать не та, кто родила - а та, кто воспитала".
Что в таком случае делать с деревом - придерживаться генетики, или социологии?
Тут неплохо бы покурить книгу по генеалогии вначале.
-- Опубликовано Andruxa в пт, 25/02/2011 - 15:34. --
все эти крайности все же редкость, к тому же таковых особей как правило мало волнует мнение окружающих и родственников, следовательно и они сами не будут интересны потомкам .
Нужна генеалогия в чистом виде. На первом этапе максимально упрощенная - скажем для родословных кошек.
у кошек/собак все по матери строится? кстати есть и важные особенности например пометы каждый год по *надцать штук . а это дополнительные опции . пожалуй особенностей даже и больше . сложнее . не всех потомков учитывать . какие-то там у них еще основные ветки есть . родоначальники. может быть для человеков и проще сначала сделать а потом уже докручивать до кошек. это конечно странно но фактъ
Видимо, создавать модулем свой тип материала, у которого помимо title (Ф.И.О. или кличка) и body (биография) будет пол и 2 ссылки на ноды того же типа, с разными значениями полов.
В случае, если родитель не установлен - NULL.
В модуле прописать функции для нахождения близких родственников.
(брат = потомок родителей мужского пола)
Модуль есть - family tree. Но он тяжелый и прожерливый.
А он и будет тяжелым и прожорливым, если делать нодами.
Судите сами - чтобы найти, к примеру, двоюродного брата - нужно найти потомков потомков родителей родителей мужского пола.
Т.е. запросы к БД растут как снежный ком.
Можно дополнительно выпендриться индексом для поиска который из себя будет представлять ниибаццо число.
Допустим
-Дедушка(id 1)
+
-Бабушка(id 2)
--Мама (id 3)
...
...
...
--Откуда-то появился папа(id 4)
и родили сына, id 5
Создаём таблицу типа
ID | history
И пихаем туда такую записи
[5] | [(1+2),(3+4)]
[3] | [12]
Ну а дальше хоть лайком, хоть "=".
Ну это так, грубый алгоритм, но кто хочет тот поймёт
Ну, [3] | [12] и так хранится в таблице ноды, а вот с [5] | [(1+2),(3+4)] - вопрос, насколько глубоко индексировать генеалогию.
Например, прабабушки-прадедедушки по линии матери (-3,-2,-1,0) будут выглядеть так:
[5] | [((-3+-2)+(-1+0)) /*мама*/ + 4]
это без родственников по отцовской линии.
Т.е. индекс растет в геометрической зависимости от глубины.
Плюс пресловутый апдейт индекса, на который решено пока забить.
Способ не идеальный, но всяко быстрее чем рекурсивные запросы
Ну да.
ТС'у - золотой напильник в руки, для написания своего векторного xml с
блэкджекомдвумя родителями.Надо искать простое и гениальное решение ))
Жаль если такового нет.
Есть простое (индексы) и гениальное (xml 2.0)
Вам какое?
Скажите, а точки зрения гиперграфа - является ли xml-структура графом?
Накладываются ли на нее в таком случае ограничения с точки зрения xml?
если прицепить индексы к ноде:
[nid]|[tid]|[rel_nid]
Таксономией создать дерево родственных связей
tid_1 Мать
tid_2 Отец
tid_3 Родной брат
tid_31 Двоюродный брат
tid_32 Сводный брат
...
tid_4 Сестра
...
т.е. 1й уровень словаря - близкие родственники, далее со всеми остановками
Тогда поля отец-мать не нужны, они задаются таксономией.
Близкие родственники просчитываются при создании ноды, все равно индексы надо когда-то создавать.
Далее из кэша периодически вытряхивается песок.
Я себе представляю простое и гениальное решение так. Все коты планеты находятся в одном словаре в качестве терминов. А вот как упорядочить взаимосвязи - это уже наверно из области фантастики ))
У каждого термина только два родителя зато может быть много детей - поэтому дерево получится очень сложное.
В таком дереве дочерние термины на самом деле станут родительскими - у каждого термина будет два дочерних - то есть родителя.
А вот как поженить два термина из разных веток - не знаю. Возможно тогда надо делать несколько словарей - семей. Но тогда термины из дальних колен будут дублироваться - ведь семьи иогут иметь общих дальних предков.
Так рассуждая закрадывается мысль что с таксономией трудно будет совладать.
Надо покурить как сделано здесь http://drupal.org/project/family
чтобы не захламлять дерево - детей втопку, они вычисляются.
Перекрестная ссылка nid_1 <- родитель/потомок -> nid_2 потребует контроля целостности.
И я плохо представляю тип данных, в котором ее можно хранить.
Вопрос в title этой ссылки - она меняется в зависимости от направления nid_1 -> nid_2 (родитель) и nid_1 <- nid_2 (потомок).
Как бы bool с инверсией в обратную сторону, но хз.
Либо - создавать две записи:
nid_2 | потомок | nid_1
А контроль вешать на БД
В итоге нашел таки скрипт который на все 100 меня порадовал - осталось только воспользоваться css. Но всетаки интересно было бы его сростить с друпалом.
Случайно наткнулся на топик. Поржал. Если задача актуальна - есть соображения.
На самом деле все гораздо проще, чем тут предлагалось. Отвлекитесь от Друпала и посмотрите в предметную область: есть два типа людей - мужчины и женщины. Они с точки зрения генеалогии отличаются принципиально - поэтому сделаем два типа материала.
Далее.
Особи обоих полов имеют следующие параметры, которые нас интересуют (читай - ССК поля):ФИО (обязательно), дата рождения (обязательна и не редактируемая кем попало), дата смерти (не обязат). Фсё! Пол определяется типом материала.
Далее.
Вся генеалогия строится на отношениях особей, зависящих от пола. То есть нужны ТИПЫ ОТНОШЕНИЙ, а не типы полей или типы материалов. Есть наверное какой-нить модуль, но можно реализовать и самому.
Какие есть отношения?
Из биологии:
Родитель - ребенок. Назначается со стороны родителя, имеет дату и порождает обратную связь со стороны ребенка. Не изменяется. Называется в зависимости от пола участников и ноды, откуда на неё смотрят: сын, дочь, мать, отец с префиксом "биологический(ая)". Родителей назназать детям нельзя - они появляются при назначении детей.
Из социологии:
Тоже родитель - ребенок, но имеет еще дату окончания (для усыновления и лишения прав). Биологическое родство по умолчанию порождает и социальное, но социальное можно редактировать.
Муж - жена. Равносторонняя связь, назначается от любой особи к противополовой. (Геев и лезбов оставим Голландии). Порождает на другом конце ответную связь и имеет дату начала и дату окончания.
И ФСЁ!
Хотя нет. Из экзотики: можно намутить смену пола. То есть связь между разнополыми существами, одно из которых прекратило своё существование (проставлена дата смерти), но при этом породило другое. Наверное нужно еще одно поле даты для таких случаев. И простой рулл для передачи родителей новому лицу. Дети остаются на старом, хотя новое может их усыновить.
Все братья, бабки, дедки, сватья, кумовья и прочие двоюродные кузины собираются вьюхами в любых вариантах на лету.
Решается вопрос о родителях - анонимусах - если особь никому не назначена в биодети - у неё нет родителя.
Можно просто собрать всех матерей (отцов) детей определенного лица.
Потом можно несколько усложнить:
1) Детей можно создавать прямо из родителя, назначая им социо и био родство.
2) В дети можно выбрать только тех, кто еще "неородителен" по данному полу (для социородства и в настоящее время).
3) Женить тоже можно только на незамужних(неженатых) в текущий момент, чтоб не допускать многоженства.
4) Проверять даты социосвязей, чтоб не допускать полигамии и многородства в прошлом
А если связи сделать через отдельные таблицы..
Впринципе есть 2 типа связи:
1.Сошлись
2.Родился
Поля таблицы Сошлись:
|ид связи|nid_1|nid_2|Тип связи|
ид связи - уникальный идентификатор
nid_1 - ИД мужа
nid_2 -ИД жены
Тип связи - Женились,Гражданский брак, Переспали... еще как..-))
Поля таблицы Родился:
|ид связи|nid_1|nid_2|nid_3|
ид связи - уникальный идентификатор
nid_1 - папа
nid_2 - мама
nid_3 - ребенок
Orion, во-первых, в задании про генеалогию речь шла, а не про ФСБ-шное досье. Кто с кем переспал на древо не влияет.
Во-вторых, в задании сказано про Друпал, а не про разработку собственной ИС. Если мутить просто собственную систему, то идея не то что бы гениальна, - она очевидна. Связи между записями, если они "многие ко многим" именно так и делаются. Другого способа еще не придумали. Только типов все же три: "Брак", "Юридический родитель", "Биологический родитель". Первые две еще должны иметь дату начала и дату окончания, а третья только дату начала.
Задача прикрутить это к друпалу.
В друпале есть что-то похожее http://drupal.org/project/term_relation_types но оно про связи между терминами
Можно сделать свой модуль для типов связей между нодами, или городить всякие CCK типа node_referrer, Reverse Node Reference, и прочее.
Что касается связи "родился" - настоятельно НЕ рекомендую в одну запись впихивать и папу и маму и ребенка! Во-первых, у кого-то нет папы у кого-то мамы. Таблица будет кривая, и с ней проблемно работать.
Во-вторых, допустим, маме написали сына. В таблице появилась строка (без папы). Чтоб потом впихнуть туда папу, надо прочесать всю таблицу, найти по ребенку нужную строку и её изменить. А если маму еще не записали, то прочесать таблицу, убедиться, что строки нет, и добавить новую. После чего аналогично с мамой. Согласитесь - проще просто добавлять строку. А контроль за многомамством возложить на интерфейс.