Расширенный запрос сортировки в Datomic - PullRequest
0 голосов
/ 31 января 2019

Представь, что у меня есть актеры и фильмы.Как я могу написать одиночный запрос , который для данного списка актеров возвращает список из 5 наборов из пяти самых последних фильмов, в которых участвовал актер (отсортировано по убыванию по дате фильма)?

Более конкретно : дан список: db / id с именем актеров и моделей:

Актер:

:db/id
:actor/name str
:actor/movie ref

Фильм:

:db/id
:db/name str
:db/date inst

Я хочу написать запрос, например:

(d/q '[:find ?actor ???????
       :in $ [?actor ...]
       :where ??????????] snapshot actors)

Ожидаемые результаты:

[[1 [2 3 4 5 6]
  7 [8 9 10 11 12]]

Где 1 и 7 - идентификаторы актеров, а 2,3,4,5,6,8,9,10,11,12 - идентификаторы фильмов.

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

1 Ответ

0 голосов
/ 12 апреля 2019

Это общая проблема - если у вас слишком много данных, чтобы поместиться в памяти, то, возможно, что-то вроде map / Reduction может работать лучше.Этот объем данных также довольно трудно отсортировать - как вы сортируете что-то, не имея всего, что сортируется в памяти одновременно?Сортировка по частям - это не то, что хорошо сопоставляется с реальностью ...

Общий подход - это то, на что Ричард Рил ссылается в своем комментарии - сортируйте вывод вручную.

Также может помочь, если вы не используете запрос для извлечения сущностей, а только запрашивает, скажем, идентификатор сущности и значение, по которому вы хотите отсортировать.Таким образом, Datomic не нужно тянуть куски всех ваших данных в одноранговый узел.Вместо этого вы можете извлечь нужные данные после сортировки результата вашего относительно разреженного запроса.

Еще одна вещь, которая может здесь помочь, - это использовать отдельный раздел для атрибута, который нужно отсортировать.на.Таким образом, вы убедитесь, что порции, которые Datomic должен извлечь, чтобы получить разреженные данные для сортировки, содержат только данные для атрибута, по которому вы сортируете.

...