NEO4j Присоединяйтесь и выберите запрос - PullRequest
0 голосов
/ 11 февраля 2020

Новый стартер для neo4j. Basi c вопрос. employeetoprojects и employees - это два типа узлов в моей базе данных.

1-й запрос Я хочу вернуть сотрудников с двумя или более проектами. Я использовал этот

MATCH (md:employeetoproject)
RETURN md.eid as ID, count(md.projectid) AS count
ORDER BY count DESC

Два вопроса:

  1. Я хочу ограничить свое представление только сотрудниками с более чем 5 проектами, как это сделать?
  2. Кроме того, я хочу вернуть имя сотрудника из таблицы сотрудников, к которой нужно присоединиться. результат. Как мне это сделать? Спасибо

1 Ответ

1 голос
/ 11 февраля 2020

Добро пожаловать в мир графических баз данных!

Несколько вещей, о которых нужно помнить, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...