Групповые и минимальные отношения собственности в Neo4j - PullRequest
0 голосов
/ 11 октября 2019

новичок в Neo4j, я ищу пользователя, который пропустит минимальное время для выполнения задачи.

На данный момент у меня есть этот запрос. Это работает, но у меня не может быть имени пользователя с минимальным временем в отношении. У меня только задача и время

MATCH (task:Task)<-[relation:can_do_it]-(user:User)
WITH task.title as taskTitle, MIN(relation.time) AS minimumTime
RETURN taskTitle, minimumTime

Спасибо за помощь: -)

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

[ОБНОВЛЕНО]

1. Чтобы найти пользователя, который быстрее всех выполнил задачу из всех , вы можете отсортировать результаты по времени и вернуть только первое:

MATCH (task:Task)<-[rel:can_do_it]-(user:User)
RETURN task.title as taskTitle, rel.time AS minimumTime, user.name as name
ORDER BY minimumTime
LIMIT 1

2. Чтобы найти пользователя, который был самым быстрым в каждой задаче, вы можете отсортировать результаты по времени, использовать агрегацию , чтобы собрать (отсортированные) данные для каждой задачи, а затем вернуть каждую задачуи первый элемент в каждой коллекции:

MATCH (task:Task)<-[rel:can_do_it]-(user:User)
WITH task, {time: rel.time, name: user.name} AS data
ORDER BY data.time
RETURN task.title AS taskTitle, COLLECT(data)[0] AS minData
1 голос
/ 14 октября 2019

Если у вас есть доступ к процедурам APOC, осенняя версия 3.5.0.5 включает новую функцию агрегирования apoc.coll.minItems() (а также вариант maxItems()), предназначенную для получения элементов, связанных с некоторым минимальным или максимальным значением.

Использование в этом случае будет:

MATCH (task:Task)<-[relation:can_do_it]-(user:User)
WITH task, apoc.agg.minItems(user, relation.time) AS minResult
RETURN task.title as taskTitle, minResult.items[0].name as name, minResult.value as minimumTime

Возвращенная структура minResult() будет выглядеть примерно так:

{
  "items": [
    {
      "name": "Lemony Snicket",
    }
  ],
  "value": 15
}

Функция вернет все возможные записикоторые имеют одинаковое минимальное (или максимальное) значение, но вы можете указать третий параметр для вызова функции, который ограничит его определенным количеством элементов (поэтому apoc.agg.minItems(user, relation.time, 1), если вам нужен только один результат, даже если есть связи).

И просто отметим, что контекст агрегирования, как и для любой функции агрегации, - это неагрегирующие переменные. Поскольку task является переменной неагрегирования, агрегация minItems () будет выполняться для каждой отдельной задачи.

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