簡體   English   中英

如何使用 core.logic 在地圖數據庫中搜索有效的嵌套地圖?

[英]How do I use core.logic to search for valid nested maps in a database of maps?

我目前正在解決一個問題,該問題要求尋找可以履行訂單的某些供應商。 供應商表示為地圖,訂單也是如此。 如果供應商可以為訂單的郵政編碼、訂單的服務水平、訂單請求的車輛提供服務,並且具有適當的額外便利條件,則供應商可以履行訂單。 我一直在嘗試使用 core.logic 來解決這個問題,所以我使用 core.logic.pldb 作為隊列將供應商存儲在邏輯數據庫中。 在我研究如何將 core.logic 與 Clojure 地圖結合使用后,我一直在嘗試使用 featurec、membero 和 PMap 的組合來解決問題。 下面顯示的代碼是我努力的當前狀態。

(pldb/db-rel fleet fl)

(def f1 {:id 1
         :zipcodes #{"02138" "33135" "33157" "02139"}
         :services #{"standard" "through_door" "to_curb" "to_door"}
         :vehicles #{"any" "sedan" "suv" "wav"}
         :extra {:covid-19 true}
         :cost 20
         :weight 100})


(def f2 {:id 2
         :zipcodes #{"33157" "02139"}
         :services #{"standard" "through_door"}
         :vehicles #{"sedan" "suv"}
         :extra {:covid-19 true}
         :cost 40
         :weight 80})


(def f3 {:id 3
         :zipcodes #{"02138" "33135"}
         :services #{"to_curb" "to_door"}
         :vehicles #{"any" "sedan"}
         :extra {:covid-19 true}
         :cost 60
         :weight 120})


(def ex_m {:ride {:zipcodes "02138"
                  :appointment-time "0630"
                  :services "to_curb"
                  :vehicles "sedan"}
           :accessibility {:extra {:covid-19 true}}})


(def fleets
  (pldb/db
    [fleet (map->PMap f1)]
    [fleet (map->PMap f2)]
    [fleet (map->PMap f3)]))


 (defn find-fleets [m] 
   (run-db* fleets [fl]
            (fresh [fl_zipcodes fl_services fl_vehicles fl_covid
                    ride_info ride_zip ride_service ride_vehicle ride_covid]
                   (membero ride_zip fl_zipcodes)
                   (membero ride_service fl_services)
                   (membero ride_vehicle fl_vehicles)
                   (== fl_covid ride_covid)
                   (featurec fl {:zipcodes fl_zipcodes
                                 :services fl_services
                                 :vehicles fl_vehicles
                                 :extra {:covid-19 fl_covid}})
                   (featurec m {:ride ride_info
                                :accessibility {:extra {:covid-19 ride_covid}}})
                   (featurec ride_info {:zipcodes ride_zip
                                        :services ride_service
                                        :vehicles ride_vehicle}))))

但是,當我嘗試運行上面的 find-fleets 函數時,

   (find-fleets (map->PMap ex_m))

我收到以下錯誤並跟蹤:

   ; Error printing return value (StackOverflowError) at clojure.lang.KeywordLookupSite$1/get (KeywordLookupSite.java:45).
   ; null

關於 core.logic 以及如何將其與 Clojure 地圖一起使用,我在這里是否遺漏了什么? 我只是錯過了一些愚蠢的錯誤嗎?

先感謝您!

如果您稍微重新表述一下您的問題,您可以使用submatch? 功能圖珀洛庫 從文檔:

(submatch? smaller larger)

  Returns true if the first arg is (recursively) a 
  subset/submap/subvec of the 2nd arg

一個例子

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require [tupelo.core :as t]))

(def shops
  [{:id       1
    :zipcodes #{"02138" "33135" "33157" "02139"}
    :services #{"standard" "through_door" "to_curb" "to_door"}
    :vehicles #{"any" "sedan" "suv" "wav"}
    :extra    {:covid-19 true}
    :cost     20
    :weight   100}

   {:id       2
    :zipcodes #{"33157" "02139"}
    :services #{"standard" "through_door"}
    :vehicles #{"sedan" "suv"}
    :extra    {:covid-19 true}
    :cost     40
    :weight   80}

   {:id       3
    :zipcodes #{"02138" "33135"}
    :services #{"to_curb" "to_door"}
    :vehicles #{"any" "sedan"}
    :extra    {:covid-19 true}
    :cost     60
    :weight   120}])

定義維修作業以匹配商店的結構(具有集合或地圖值的地圖)。

(def job
  {:zipcodes #{"02138"}
   :services #{"to_curb"}
   :vehicles #{"sedan"}
   :extra    {:covid-19 true}})

單元測試顯示子submatch? 在行動中發揮作用。

(dotest
  (let [matches (t/keep-if #(t/submatch? job %) shops)]  ; synonym for `filter`
    (is= matches
      [{:id       1,
        :zipcodes #{"02138" "02139" "33157" "33135"},
        :services #{"to_curb" "standard" "to_door" "through_door"},
        :vehicles #{"wav" "any" "suv" "sedan"},
        :extra    {:covid-19 true},
        :cost     20,
        :weight   100}
       {:id       3,
        :zipcodes #{"02138" "33135"},
        :services #{"to_curb" "to_door"},
        :vehicles #{"any" "sedan"},
        :extra    {:covid-19 true},
        :cost     60,
        :weight   120}])
    ))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM