2017-02-21 8 views
1

엔터티 ID로 pull 메서드를 사용하여 엔터티를 검색하려면 어떻게해야합니까? 나는 약간의 datoms/facts (right phraseing?)를 db에 추가하기 위해 transact를 사용했다. 내가 같은 간단한 쿼리를 할 경우 나는 엔티티 ID가의를 볼 수 있습니다Datomic의 pull 메소드를 사용하여 엔티티 ID로 엔티티를 가져 오려면 어떻게해야합니까?

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

결과의 존재 : 이제

{[17592186045418] [17592186045420] [17592186045423]}

I 이 중 하나를 pull을 사용하여 검색하고 싶습니다. 그러나 pull에 대한 문서의 예제는 해당 엔터티가 id와 연결된 예제를 사용합니다.

즉, 문서는 뮤직 브레인 샘플 데이터 세트에서 예를 참조하고 제안 샘플은 다음

(pull db '[*] led-zeppelin)

가 (문서, 스프레드이 표시되지 않지만), LED 펠린을 갖는 경우 , 선택기 패턴 DB를 : (def led-zeppelin [:artist/gid #uuid "678d88b2-87b0-403b-b63d-5da7465aecc3"])

워드 프로세서

는 풀 명령 세가지 걸리는 말 : here를 알 수있는 바와 같이 (과 같이 정의 된 나는 각 엔티티에 대해 어떤 속성을 가져 왔는지, 그리고 엔티티의 "eid"를 생각한다. 그래서 위의 led-zeppelin var은 어떻게 든 eid입니다.

나는 실제로 어떤 일이 벌어지는 지 완전히 추리하지 않습니다. : artist/gid는 musicbrainz의 스키마에 정의 된 id 속성이며 세 번째 항목은 특정 ID와 같습니다. #uuid가 뭔지 잘 모르겠습니다.

하지만 제 경우에는 엔티티에 대한 id 속성을 정의하지 않았습니다. 각 엔티티에 기본적으로 할당 된 고유 엔티티 ID를 사용할 수 있기를 바랬습니다. 이것이 가능한가? 그렇다면 어떻게 될까요?

+0

"쿼리를 사용한 표현식 끌어 오기"는 링크 된 파일 맨 아래에 있습니다. – ClojureMostly

+0

@Clojure 나는'pull' 함수를 사용하는 방법을 이해하려고 노력 중이다. – fraxture

답변

2

여기 해결책은 간단합니다. 그냥 직접 엔티티 ID 번호 드롭 :

(d/pull db '[*] 17592186045418)

내가 만들었던 실수 즉 문자열로 이드를 사용하는 것이 었습니다그것을 두 번 인용함으로써.

2

쿼리의 목적은 하나 이상의 속성이있는 항목의 EID를 찾는 것입니다. EID를 이미 알고있는 경우 쿼리가 필요 없으며 해당 엔티티에 대한 attr/val 쌍을 검색하기 만하면됩니다. 그래서 entity 기능을 사용 (d/entity ...)의 결과가 게으른 것을

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

주 당신은 모든 항목을 볼 수있는 Clojure의지도로 강제 할 필요가있다.

Datomic's own documentation 외에 더 많은 예제와 단위 테스트 in the Tupelo Datomic library을 찾을 수 있습니다. the James Bond example은 많은 편의 기능을 포함 할뿐만 아니라 일부 Datomic 개념을 명확히하는 데 도움이됩니다.

+0

이것은 도움이된다. 여기에 내가 한 일은 내 엔티티가 중첩 된 구성 요소를 가지고 있다는 것입니다.이 구성 요소는 재귀 적으로지도에 강제로 삽입해야 할 필요가 있다고 생각합니다. 일단 eid를 숫자로만 사용할 수 있다고 생각하면 pull 메서드를 사용했습니다. 그것은 전체 구조를 일반 데이터 구조로 반환했기 때문에 좋았습니다. – fraxture

3

끌어 오기 세 번째 인수는 엔터티에 대한 참조입니다. 고유 한 속성 값을 사용하여 엔티티를 참조하는 led-zepplin 예제와 같이 쿼리가 반환 한 ID 중 하나를 사용하거나 lookup ref을 사용할 수 있습니다.

+0

쿼리에서 반환하는 ID 중 하나를 사용하는 모습을 보여줄 수 있습니까? 왜냐하면 나는 성공하지 않고 그것을 시도했기 때문에 단지 구문 오류 일뿐입니다. 아니면 (@AlanThompson이 제안한대로)'entity' 메소드를 사용하겠습니까? – fraxture