Как решить проблему с Common-Common-Path-like - с помощью Cypher, в графической базе данных Neo4j - PullRequest
0 голосов
/ 28 июня 2018

Мы используем neo4j для хранения академической и профессиональной эволюции многих людей ( Пользователь ) с целью обработки и предоставления информации, которую она содержит, для наших клиентов.

Например, они могут попросить о наиболее частой профессиональной эволюции для людей, которые имели определенный диплом (представленный как узел « Диплом » в базе данных графа) и работали позже на определенной работе ( Узел « Job »).

Обе Работа и Диплом играют аналогичную роль, как «своего рода» шаг, который каждый может сделать в своем резюме (пользователи не имеют к ним прямого отношения). Резюме - это профессиональная деятельность, проводимая определенным лицом в определенный период времени: к ним относится один и только один Пользователь , а также :CONTAINS a " Job_or_Diploma", чтобы помочь их классификации.

Резюме данного пользователя связаны друг с другом отношениями :LEADS_TO, следуя их последовательности во времени. Эта последовательность возвращает все резюме этого пользователя. Таким образом, у нас есть пути, как:

(и: Пользователь) - [: HAS] -> (: Резюме) - [: LEADS_TO] -> (: Возобновить) <- [: HAS] - (и) </strong>

Таким образом, проблема, которую нам нужно решить, стала бы: найти самый популярный путь между start: Diploma node и end: Job среди всех путей с "* 1037". * Job_or_Diploma"только узлы.

Поскольку мы определяем наиболее распространенный путь с помощью свойств, которые не принадлежат непосредственно узлам " Job_or_Diploma " и даже любому отдельному узлу («популярность» пути зависит от всего пути, потому что мы измерьте это числом пользователей , которые полностью следовали за ним), мы изо всех сил пытаемся определить, как его найти.

Еще одна ловушка, с которой нам приходится сталкиваться, заключается в том, что на самом деле нет прямой связи между 2 " Job_or_Diploma ": a Резюме :LEADS_TO в следующем Резюме учебный план пользователя, который :HAS их, и каждый резюме :CONTAINS один " Job_or_Diploma " больше, но эти " Job_or_Diploma " не имеют края между собой (см. скриншоты) ниже). Поэтому искомый путь не существует на графике.

Отсюда возникает вопрос: есть ли способ найти «путь» или, вернее, «последовательность» из « Job_or_Diploma », которые были взяты (в хронологическом порядке) наибольшим числом пользователей между определенным дипломом и определенной работой? В идеале мы ищем что-то, что мы могли бы реализовать, используя только Cypher.

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

Тип конфигурации, с которой мы имеем дело в этой проблеме

2 пользователя Резюме между дипломом инженера и менеджером

Длина 4 пользователей-2 Резюме пути между дипломом инженера и техническим директором

Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 28 июня 2018

Поскольку узел может иметь несколько меток, ваши узлы Resume также могут иметь метку Diploma или Job. Нет необходимости иметь отдельные узлы с метками Diploma или Job.

Таким образом, вы можете упростить модель данных, например:

(u:User)-[:HAS]->(:Resume:Diploma)-[:LEADS_TO]->(:Resume:Job)<-[:HAS]-(u)

И найти все пути, которые начинаются с степени «Инженер» и заканчиваются на «Управлении», было бы очень просто:

MATCH path=(u:User)-[:HAS]->(:Diploma {type: 'Engineering'})-[:LEADS_TO*]->(:Job {type: 'Management'})
RETURN path;

Кроме того, у вас может не быть реальной причины вообще иметь метку Resume (например, в приведенном выше запросе она не используется), так что вы можете еще больше упростить свою модель данных, чтобы просто иметь Diploma и Job меток.

...