Добро пожаловать в мир графических баз данных!
Несколько вещей, о которых нужно помнить, Neo4j не имеет таблиц, терминология баз данных графов немного отличается от той, к которой вы привыкли.
Neo4j имеет узлы и отношения. Узел может иметь метку, и это делает его похожим на запись в таблице, но строгий набор свойств не требуется для узлов определенных меток (это отличается от свойств таблицы в СУБД), а узлы могут иметь несколько меток Таким образом, модель базы данных графа немного более гибкая, позволяя узлу играть несколько ролей в зависимости от контекста того, как вы хотите просматривать данные.
Моделирование данных также отличается в базах данных графа тем, что отношения должны быть создан и использован вместо использования подхода внешнего ключа / таблицы. Кроме того, объединяющие таблицы не нужны, просто используйте отношения для соединения рассматриваемых узлов. Не думайте об этом, как о реляционных данных, это не соединения таблиц.
Более графическим способом моделирования ваших данных может быть:
(:Employee)-[:WORKS_ON]->(:Project)
Таким образом, вы бы имели: Узлы сотрудника, Узлы проекта и отношения WORKS_ON, соединяющие их. В процессе загрузки / импорта данных вы можете создать все свои узлы: Employee, затем все свои узлы: Project, а затем создать связь между ними. Также индекс для обеих этих меток релевантных свойств, которые вы хотите использовать для поиска, будет полезен для будущих запросов, таких как индекс для :Employee(eid)
.
Запрос для поиска сотрудников, которые работают более чем на 5 проектов и отображают имя сотрудника, eid и count, будут выглядеть следующим образом:
MATCH (e:Employee)
WITH e, size((e)-[:WORKS_ON]->(:Project)) as count
WHERE count > 5
RETURN e.name as name, e.eid as eid, count
ORDER BY count DESC
Обратите внимание, что если отношения: WORKS_ON всегда подключаются к узлу: Project, то вы можете удалить метку из этого шаблона и запрос станет более эффективным, если использовать проверку степени: отношения WORKS_ON вместо необходимости расширять отношения и фильтровать узел на другом конце, чтобы убедиться, что это: Проектный узел:
WITH e, size((e)-[:WORKS_ON]->()) as count
Это является основной причиной, по которой я использовал size()
на желаемом шаблоне, а не соответствовал полному шаблону и использовал функцию агрегирования count()
. Этот подход работает нормально, но не может быть оптимизирован, как упомянуто выше, для работы со степенями взаимосвязи.
Однако для справки вы получите тот же ответ, используя полный шаблон в MATCH и count () функция:
MATCH (e:Employee)-[:WORKS_ON]->(p:Project)
WITH e, count(p) as count
WHERE count > 5
RETURN e.name as name, e.eid as eid, count
ORDER BY count DESC