Мой шифровальный запрос, в котором я считаю входящие отношения, кажется медленным, нужна помощь для повышения производительности - PullRequest
0 голосов
/ 04 августа 2020

Уважаемые эксперты Cypher / Neo4j,

У меня есть следующая часть графика, на которой смоделированы страны, города, компании и проекты. У меня есть следующий запрос Cypher, в котором я получаю узлы страны, а также уникальные идентификаторы содержащихся узлов города, количество LOCATED_IN и количество отношений MAY_BE_EXECUTED_IN

MATCH (country:Country)
OPTIONAL MATCH (country)-[:CONTAINS]->(city:City)
OPTIONAL MATCH (:Project)-[may_be_executed_in:MAY_BE_EXECUTED_IN]->(country)
OPTIONAL MATCH (:Company)-[located_in:LOCATED_IN]->(country)
RETURN DISTINCT country {.*
    , city: COLLECT(DISTINCT city.identifier)
    , MAY_BE_EXECUTED_IN_Count: COUNT(DISTINCT may_be_executed_in)
    , LOCATED_IN_Count: COUNT(DISTINCT located_in)
}
ORDER BY country.identifier ASCENDING

извлечение графика

В базе данных 76 узлов страны и около 10000 узлов компании. Когда я запускаю запрос, это занимает от 30 до 40 секунд, когда я оставляю часть MAY_BE_EXECUTED_IN_Count: COUNT(DISTINCT may_be_executed_in), запрос завершается примерно за 40 миллисекунд. Я понимаю, что ресурсы, выделенные neo4j, играют роль, но я предполагаю, что мой запрос не подходит. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 04 августа 2020

продолжая поиск, я нашел ответ, запрос, который, как мне кажется, мне нужен, следующий:

MATCH (country:Country)
OPTIONAL MATCH (country)-[:CONTAINS]->(city:City)
RETURN DISTINCT country {.*
  , city: COLLECT(DISTINCT city.identifier)
  , IS_SPECIAL_PROVISION_FOR_Count: size((:AnnouncementOfOpportunity)-[:IS_SPECIAL_PROVISION_FOR]->(country))
  , LOCATED_IN_Count: size((:Organization)-[:LOCATED_IN]->(country))
}
ORDER BY country.identifier ASCENDING

Я использую функцию SIZE() для вычисления количества отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...