Ayarlearndatalogtoday.org çalınan verilerle filmler ve döküm aşağıdaki DataScript veri tabanını düşünün: Aşağıdaki kod sürece project.clj
bir bağımlılık [datascript "0.15.0"]
içerdiği, JVM/Clojure Çoğaltma veya ClojureScript Çoğaltma çalıştırılabilir.DataScript'te tam olarak bir refs vektörü ile eşleşen bir sorgu nasıl oluşturulur?
- filmi varlık:
(ns user (:require [datascript.core :as d])) (def data [["First Blood" ["Sylvester Stallone" "Brian Dennehy" "Richard Crenna"]] ["Terminator 2: Judgment Day" ["Linda Hamilton" "Arnold Schwarzenegger" "Edward Furlong" "Robert Patrick"]] ["The Terminator" ["Arnold Schwarzenegger" "Linda Hamilton" "Michael Biehn"]] ["Rambo III" ["Richard Crenna" "Sylvester Stallone" "Marc de Jonge"]] ["Predator 2" ["Gary Busey" "Danny Glover" "Ruben Blades"]] ["Lethal Weapon" ["Gary Busey" "Mel Gibson" "Danny Glover"]] ["Lethal Weapon 2" ["Mel Gibson" "Joe Pesci" "Danny Glover"]] ["Lethal Weapon 3" ["Joe Pesci" "Danny Glover" "Mel Gibson"]] ["Alien" ["Tom Skerritt" "Veronica Cartwright" "Sigourney Weaver"]] ["Aliens" ["Carrie Henn" "Sigourney Weaver" "Michael Biehn"]] ["Die Hard" ["Alan Rickman" "Bruce Willis" "Alexander Godunov"]] ["Rambo: First Blood Part II" ["Richard Crenna" "Sylvester Stallone" "Charles Napier"]] ["Commando" ["Arnold Schwarzenegger" "Alyssa Milano" "Rae Dawn Chong"]] ["Mad Max 2" ["Bruce Spence" "Mel Gibson" "Michael Preston"]] ["Mad Max" ["Joanne Samuel" "Steve Bisley" "Mel Gibson"]] ["RoboCop" ["Nancy Allen" "Peter Weller" "Ronny Cox"]] ["Braveheart" ["Sophie Marceau" "Mel Gibson"]] ["Mad Max Beyond Thunderdome" ["Mel Gibson" "Tina Turner"]] ["Predator" ["Carl Weathers" "Elpidia Carrillo" "Arnold Schwarzenegger"]] ["Terminator 3: Rise of the Machines" ["Nick Stahl" "Arnold Schwarzenegger" "Claire Danes"]]]) (def conn (d/create-conn {:film/cast {:db/valueType :db.type/ref :db/cardinality :db.cardinality/many} :film/name {:db/unique :db.unique/identity :db/cardinality :db.cardinality/one} :actor/name {:db/unique :db.unique/identity :db/cardinality :db.cardinality/one}})) (def all-datoms (mapcat (fn [[film actors]] (into [{:film/name film}] (map #(hash-map :actor/name %) actors))) data)) (def all-relations (mapv (fn [[film actors]] {:db/id [:film/name film] :film/cast (mapv #(vector :actor/name %) actors)}) data)) (d/transact! conn all-datoms) (d/transact! conn all-relations)
Özetle Açıklaması, varlıklar iki tür bu veritabanına filmler ve aktörler (kelime cinsiyet gözardı edilmiş amaçlanan) -ve datoms üç çeşit vardır:
:film/name
(benzersiz dize) - filmi varlık:
:film/cast
(birden ref) - aktör varlık:
:actor/name
(benzersiz dize) Ben soran bir sorgu oluşturmak istiyoruz
Soru: Tek başına bu N
aktörler, ve bu N
aktörler sahip olan film, N> = 2 için, tek yıldız olarak ortaya çıktı?
(d/q '[:find ?film-name
:where
[?film :film/name ?film-name]
[?film :film/cast ?actor-1]
[?film :film/cast ?actor-2]
[?actor-1 :actor/name "Nancy Allen"]
[?actor-2 :actor/name "Peter Weller"]]
@conn)
; => #{["RoboCop"]}
, sorgu kusurludur herhangi maçlar Allen veya Weller- olmayan herhangi aktörleri dışlaması gerektiğini ifade etmek nasıl bilmiyorum çünkü Yine, sadece Allen ve Weller'in başka aktörler olmadan işbirliği yaptığı filmleri bulmak istiyorum, bu yüzden yukarıdaki sorguyu boş set üretmek için uyarlamak istiyorum. Bu gereksinimi zorlamak için bu sorguyu nasıl ayarlayabilirim?
Gecikme için özür dilerim (ve sizi rahatsız etmek için özür dilerim)! Sorguda * sadece-o-aktörler? * * Gibi bir kontrol koymanın herhangi bir yararı var mı? Https://gist.github.com/fasiha/647a48420770536a4fa952a4b38f69d7#file-stackoverflow-clj-L97-L116 başına sorgunun dışındaki tüm isabetleri ve işlem sonrası işlemleri almanız mümkün müdür? Bu uygulama 'datoms' rotası gitmeyecek mi? –
Uygulamanız da iyi görünüyor! Akıllıca farklı bir kullanımınız var. Bir optimizasyon olarak, belki de sıralamadan daha verimli olan farklı aktörlerin sayısını sayabilirsiniz. Datom kullanıp kullanmama hakkında: Performans hakkında herhangi bir iddiada bulunmayacağım, ölçütleri çalıştırmalısınız. –
Şu anda olduğu gibi kodda bir veya iki ek şeyi temizlemek zorunda kaldım: https://gist.github.com/fasiha/647a48420770536a4fa952a4b38f69d7#file-stackoverflow-clj-L60-L85 (eğer güncellemek isterseniz) cevap) ama işe yarıyor! Teşekkürler!! –