Как решить проблему с Common-Common-Path-like - с помощью Cypher, в графической базе данных Neo4j
Мы используем neo4j для хранения академического и профессионального развития многих людей (пользователей) с целью обработки и предоставления информации, которую он содержит, для наших клиентов.
Например, они могут попросить о наиболее частой профессиональной эволюции для людей, которые имели определенный диплом (представленный как узел " Диплом " в базе данных графа) и работали позже на определенной работе (узел " Работа ").
И Работа, и Диплом играют одинаковую роль, как "своего рода" шаг, который каждый может сделать в своем резюме (пользователи не имеют к ним прямого отношения). Резюме - это профессиональная деятельность, проводимая определенным лицом в определенный период времени: к ним относится один-единственный пользователь, а также :CONTAINS
" Job_or_Diploma ", чтобы помочь их классификации.
Резюме данного пользователя связаны друг с другом :LEADS_TO
отношения, следуя их последовательности во времени. Эта последовательность возвращает все резюме этого пользователя. Итак, у нас есть такие пути:
(и: Пользователь)-[:HAS]->(: Резюме)-[:LEADS_TO]->(: Резюме) <- [: HAS] - (и)
Таким образом, проблема, которую нам нужно решить, заключалась бы в следующем: найти наиболее популярный путь между началом: узлом диплома и концом: узлом задания, среди всех путей только с узлами " Job_or_Diploma ".
Поскольку мы определяем наиболее распространенный путь по свойствам, которые не принадлежат непосредственно узлам " Job_or_Diploma " и даже любому отдельному узлу ("популярность" пути зависит от всего пути, потому что мы измеряем его числом пользователей, которые следовали это полностью), мы боремся, чтобы определить, как его найти.
Еще одна ловушка, с которой нам приходится сталкиваться, заключается в том, что на самом деле нет прямой связи между двумя " Job_or_Diploma ": Резюме :LEADS_TO
Следующее резюме в учебной программе пользователя, который :HAS
их, и каждое резюме :CONTAINS
один " Job_or_Diploma " больше, но эти " Job_or_Diploma " не имеют края между собой (см. скриншоты ниже). Таким образом, путь, который мы ищем, не существует в графе.
Отсюда вопрос: есть ли способ найти "путь" или, скорее, "последовательность" " Job_or_Diploma ", которые были взяты (в хронологическом порядке) наибольшим числом пользователей между определенным дипломом и определенной работой? В идеале мы ищем что-то, что мы могли бы реализовать, используя только Cypher.
Мы были бы рады получить любую информацию, чтобы показать нам, как действовать. Ниже приведены несколько экранов некоторых частей нашего графика, которые подразумеваются в этой проблеме:
Тип конфигурации, с которой мы имеем дело в этой проблеме
Резюме 2 пользователей между дипломом инженера и менеджером
4 пользователя длина-2 Возобновить пути между дипломом инженера и должности технического директора
Заранее спасибо за вашу помощь!
1 ответ
Поскольку узел может иметь несколько меток, ваш 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
этикетки.