2015-05-20 5 views
5

के साथ काम करना मैं वर्तमान में अपने क्लोजर ऐप (कोर्मा के साथ) को डेटोमिक फ्रेमवर्क में माइग्रेट करने पर काम कर रहा हूं और जब मैं प्रश्नों का अनुवाद कर रहा था, तो एक लूप में रहा। मुझे एहसास है कि प्रश्न पूरी तरह से लचीले नहीं हैं (कोर्मा की तुलना में), उदाहरण के लिए मैं अलग-अलग चर के आस-पास सशर्त खंडों का मूल्यांकन करना चाहता हूं।डेटामिक - या क्लॉज

एक कोरमा क्वेरी को देखते हुए,

(select users 
    (where (or (and {:first_name [= "user"]} 
        {:last_name [= "sample"]}) 
       {:email [= "[email protected]"]}))) 
इस

, Datomic में बदला जा सकता कुछ इस तरह के साथ?

[:find ?e 
    :where (or (and [?u :user/first-name "user"] 
        [?u :user/last-name "sample"]) 
      [?u :user/email "[email protected]"]) 

लेकिन इस क्वेरी करने (Datomic डॉक्स के अनुसार), के रूप में सभी खंड एक या खंड में प्रयोग किया जाता चर के एक ही सेट का उपयोग करना चाहिए की सिफारिश की तरीका नहीं है। मैं चर के विभिन्न सेटों के आस-पास एक या खंड कैसे सेट करूं?

उत्तर

5

आपकी क्वेरी को काम करना चाहिए। ?u

(d/q '[:find ?u 
     :where (or (and [?u :user/first-name "user"] 
         [?u :user/last-name "sample"]) 
        [?u :user/email "[email protected]"])] 
    [[1 :user/first-name "user"] 
    [1 :user/last-name "sample"] 
    [2 :user/email "[email protected]"] 
    [3 :user/first-name "user"] 
    [3 :user/last-name "not sample"]]) 

=> #{[1] [2]} 

आप विभिन्न चर का उपयोग करने के लिए उन्हें जरूरत है, तो आप or-join का उपयोग स्पष्ट रूप से उन्हें सूचीबद्ध करने के लिए कर सकते हैं::

(d/q '[:find ?u 
     :in $ ?first-name ?last-name ?email 
     :where (or-join [?u ?first-name ?last-name ?email] 
       (and [?u :user/first-name ?first-name] 
        [?u :user/last-name ?last-name]) 
       [?u :user/email ?email])] 
    [[1 :user/first-name "user"] 
     [1 :user/last-name "sample"] 
     [2 :user/email "[email protected]"] 
     [3 :user/first-name "user"] 
     [3 :user/last-name "not sample"]] 
    "user" 
    "sample" 
    "[email protected]") 

=> #{[1] [2]} 
+0

'(घ/q '[(अपरीक्षित!): लगता है यू ? $ में प्रथम नाम last- नाम? ईमेल : जहां (या (और [? यू: उपयोगकर्ता/प्रथम नाम? पहला नाम] [? यू: उपयोगकर्ता/अंतिम नाम? अंतिम नाम]) [? u: उपयोगकर्ता/ईमेल? ईमेल ])] ' उस मामले में काम नहीं करेगा, क्योंकि चर भिन्न हैं ent –

+0

मैंने उस परिदृश्य के लिए उत्तर अद्यतन किया। –

0

यह बहुत के समान है अपने खंड के सभी एक ही चर का उपयोग करना इस सवाल:

SQL LIKE operator in datomic

आप की जाँच करने की जरूरत है प्रश्न नियम

http://docs.datomic.com/query.html

आपकी क्वेरी कुछ इस प्रकार दिखाई देगा

(let [rules '[[(find-user ?user ?fname ?lname ?email) 
       [?user :user/first-name ?fname] 
       [?user :user/last-name ?lname]] 
       [(find-user ?user ?fname ?lname ?email) 
       [?user :user/email ?email]]]] 

    (:find ?user 
     :in $ % ?fname ?lname ?email 
     :where 
     (find-user ?user ?fname ?lname ?email) 
     conn rules "user" "sample" "[email protected]"))