2017-02-21 12 views
1

Как я могу получить объект с использованием метода pull по его идентификатору объекта? Я использовал транзакцию, чтобы добавить некоторые данные/факты (правильную формулировку?) В мой db. Я могу видеть, идентификатор объекта, если я сделать простой запрос типа:Как использовать метод выталкивания данных для захвата объекта по его идентификатору объекта?

[:find ?e 
:where 
[?e :arb/value] 
] 

Результат существо:

{[17592186045418] [17592186045420] [17592186045423]}

Теперь я 'd хотел бы получить один из них, используя pull. Однако в примерах в документах для pull используются примеры, в которых объект, о котором идет речь, связан с идентификатором.

В частности, документы относятся к примеру из MusicBrainz набора выборки данных, и образец, они указывают на то:

(pull db '[*] led-zeppelin)

где (хотя документы не показывают это) LED-дирижабль имеет был определен как так (как можно видеть here:

(def led-zeppelin [:artist/gid #uuid "678d88b2-87b0-403b-b63d-5da7465aecc3"])

документы говорят о том, что команда тянуть берет три вещи: дБ, шаблон выбора определяя, что я думаю, какие атрибуты вытягиваются для каждого объекта, и «eid» объекта. Таким образом, выше led-zeppelin var - это как-то eid.

Я не совсем понимаю, что там происходит. Исполнитель: artist/gid - это атрибут id, определенный в схеме для musicbrainz, и третий элемент выглядит как конкретный идентификатор. Я не уверен, что такое #uuid.

Но в моем случае я не определил атрибут id для своих объектов. Я надеялся, что сможет использовать уникальный идентификатор объекта, который, по моему мнению, назначается по умолчанию для каждого объекта. Это возможно? Если да, то как это будет сделано?

+0

«Вытянуть выражение с использованием запроса» находится в самом низу связанного файла. – ClojureMostly

+0

@ClojureMostly Я пытаюсь понять, как использовать функцию 'pull' – fraxture

ответ

2

Решение здесь простое. Просто падение числа идентификатора непосредственно:

(d/pull db '[*] 17592186045418)

Ошибку я сделал, чтобы использовать Ид в виде строки, т.е.путем двойного цитирования.

2

Цель запроса состоит в том, чтобы найти EID чего-то, с учетом одного или нескольких его свойств. Если вы уже знаете EID, вам не нужен запрос, вы просто хотите получить пары attr/val для этого объекта. Поэтому использовать entity функцию:

(let [eid 12345 
     result (into {} (d/entity db eid)) ] 
    (println result)) 

Обратите внимание, что результат (d/entity ...) ленив, и вам необходимо, чтобы заставить его в карту Clojure, чтобы увидеть все детали.

Кроме Datomic's own documentation, вы можете найти еще примеры и блок-схемы in the Tupelo Datomic library. Помимо того, что содержит множество удобных функций, the James Bond example помогает прояснить некоторые концепции Datomic.

+0

Это полезно. Единственное, что я нахожу здесь, это то, что у моих сущностей есть вложенные компоненты, которые, я думаю, также должны быть рекурсивно вынуждены на карты ... Как только я понял, что eid можно использовать точно так же, как число, и использовал метод pull , это было хорошо, потому что она вернула всю структуру как обычную структуру данных. – fraxture

3

Потянет третий аргумент - ссылка на объект. Вы можете использовать один из идентификаторов, возвращаемых вашим запросом, или lookup ref, например, в примере led-zepplin, где вы ссылаетесь на объект с уникальным значением атрибута.

+0

Не могли бы вы привести пример того, как будет выглядеть одна из идентификаторов, возвращаемых запросом? Потому что я пробовал это без успеха ... Может быть, это синтаксическая ошибка. Или вы имеете в виду, что я бы (как предложил @AlanThompson) использовать метод 'entity'? – fraxture

 Смежные вопросы

  • Нет связанных вопросов^_^