Получить общее количество и разбитый на страницы результат в одном запросе шифра (neo4j) - PullRequest
0 голосов
/ 17 января 2019

Я пишу API для возврата данных neo4j. Для моего случая я получаю все совпадающие узлы. API принимает userId, limit и offset и возвращает список данных, соответствующих этому условию.

Я нашел одно решение Cypher, чтобы вернуть общее число узлов, а также ограниченный набор , но оно довольно старое. Не уверен, что это все еще лучший способ сделать это.

Производительность такая же, как и при запуске 2 отдельных запросов, по крайней мере один из них будет кэшироваться neo4j после нескольких запусков.

Match(u:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p) return distinct(p) skip 0 limit 10 

Match(u:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p) return count(distinct(p))

Я хочу, чтобы результат был что-то вроде

{
  items: [ {},  {}], # query 1
  total: 100,   # query 2
  limit: 10,  # can get from input
  skip: 0    # can get from input
}

1 Ответ

0 голосов
/ 17 января 2019

Это будет немного зависеть от того, сколько информации вам нужно от узлов, для которых вы хотите подсчитать, и от того, хотите ли вы получить отчетливые результаты или нет.

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

MATCH (u:WorkstationUser {id: "alw:44807"})
WITH u, size((u)-[:HAS_ACCESS_TO]->(p)) as total
MATCH (u)-[:HAS_ACCESS_TO]->(p) 
RETURN p, total
SKIP 0 LIMIT 10 

Однако, если требуются разные результаты или вам необходимо отфильтровать узел по метке или свойствам, вам придется расширить все результаты, чтобы получить итоговые значения. Если результатов не так много (миллионы или миллиарды), вы можете собрать отдельные узлы, получить размер коллекции, а затем РАССМОТРЕТЬ результаты и страницу:

MATCH (:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p)
WITH collect(DISTINCT p) as pList
WITH pList, size(pList) as total
UNWIND pList as p
RETURN p, total
SKIP 0 LIMIT 10 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...