Neo4J задается вопросом, как настроить структуру домена. Разделенные отношения

У меня есть приложение, использующее MySQL в качестве базы данных, а также режим гибернации и распорки. Я работаю над преобразованием этого для использования Neo4J вместо Hibernate и MySQL. Немного другая структура, новый способ осмысления отношений - они более жизненные. Во всяком случае, у меня есть узел человека, который имеет отношение к узлу компании, и это отношение используется. Итак, человек работает в компании. У человека также есть навыки, и эти навыки можно получить, работая в компании. поэтому мне нужно как-то перейти от отношений по найму к навыку.

Я знаю, что вы не можете перейти от отношения к отношению, поскольку они просто связаны от узла к узлу (ребро). Поэтому я уверен, что мне просто нужно подумать о том, как лучше связать эти объекты. Я думал о том, чтобы каким-то образом разделить отношения занятости на узел, возможно, в качестве опыта. Итак, у человека есть опыт. Они получили этот опыт, работая в компании. Они получили эти навыки из этого опыта. Это имеет смысл, но я думаю об узлах как о «конкретной» информации, с которой я мог бы начать и вернуться к другой «конкретной» информации, и опыт работы с узлом не кажется правильным. Это кажется расплывчатым, это похоже на то, что должно храниться в отношениях, как у меня сейчас, так что я вернулся к исходной точке.

Еще одна вещь, с которой я борюсь, и что разделение опыта на узлы может помочь в этом, заключается в том, что человек может получить несколько типов опыта от одной и той же компании — так сказать, продвигаясь вверх по пищевой цепочке. Так что мне нужно было бы иметь человека с несколькими отношениями к разным опытам, которые указывают на одну и ту же компанию. И это нормально — имеет смысл иметь несколько отношений, чтобы иметь разный опыт. Кажется, что компании предстоит пройти долгий путь, прежде чем она увидит, кого она наняла.

Может быть, опыт мог бы быть больше похож на должность. У компании есть должность, и эта должность, как известно, связана с этими навыками. Должность заполняется человеком, и человек может добавить навыки к тому, что уже связано с этой должностью. Но те навыки, которые они добавляют, не нужно добавлять по умолчанию, поэтому потребуется установить какой-то флаг в отношениях между положением и навыком.

Хм, это может сработать. Кто-нибудь еще борется с такими проблемами построения домена с помощью Neo4J или любой другой графической базы данных. Это определенно новый способ мышления о структурах данных. Почти лучше всего забыть все знания и «правила» rdbms, которые вы выучили.


person Elrond    schedule 13.05.2012    source источник


Ответы (1)


Да, вы столкнулись с гиперкраем. Взгляните на http://docs.neo4j.org/chunked/stable/cypher-cookbook-hyperedges.html

Одним из эквивалентов в вашем случае может быть Человек, связанный с узлом Опыт/Позиция. Узел Experience имеет два типа отношений: один — EmployedAt, а другой — AquiredSkill. Пример: (Человек)-[:имеет]->(Опыт) (Опыт)-[:EmployedAt]->(Компания) (Опыт)-[:Приобретенный навык]->(Навык)

И у вас есть несколько опытов для человека и несколько навыков для опыта/должности. Таким образом, вы можете проследить навыки/жизнь человека в компании по его опыту, и если вы также поделитесь навыками, то вы сможете отслеживать наборы навыков в разных компаниях.

Думаете, это имеет смысл?

person Luanne    schedule 14.05.2012
comment
Да, это оно. Спасибо за помощь. Я думал, что это будет решением, но что меня сбивало с толку, так это какое-то смутное отношение к опыту промежуточного узла. Так что я пытался сделать его более описательным, как опыт, но информация, которая мне была нужна для этого опыта, была в двух разных узлах, и я добрался до гиперкрая — отделения от этих отношений. Еще раз спасибо. - person Elrond; 28.05.2012