另一个人没有在实践中有什么好处呢?我理解他们所做的事情,但他们在实际使用中的局限性和能力是什么?我正在考虑Drools vs一个新的AI项目的java prolog,但对其他建议持开放态度.在复杂的关系数据集或替代方案上进行推理有哪些流行的方法?
和许多程序员一样,我在大学里学过Prolog,但只是很少.我知道Prolog和Datalog密切相关,但Datalog更简单吗?另外,我相信我读到Datalog不依赖于逻辑子句的排序,但我不确定为什么这是优点.据说CLIPS完全不同,但对我来说理解太微妙了.有人可以提供其他语言的一般语言亮点吗?
我正在使用带有play框架的datomic.游戏很棒,而且数据库很快.总体上是一个很好的组合.因为,我是datomic(和数据目录,即查询语言数据组使用)的新手,我无法对结果进行排序(就像我们一样,在sql中排序).例如.
如果我的查询是:
q= [:find ?title 
:where 
[?e :movie/title ?title]
[?e :movie/director "Dave Swag"]
[?e :movie/year ?year]
[(sort ?year)] //here I am trying to sort by year
]
Run Code Online (Sandbox Code Playgroud)
它应该返回导演为Dave Swag的电影的标题,结果按照发布图像的年份排序.谢谢 :)
设置考虑以下DataScript数据库的电影和演员,数据从learndatalogtoday.org窃取:以下代码可以在JVM/Clojure REPL或ClojureScript REPL中执行,只要project.clj包含[datascript "0.15.0"]作为依赖项.
(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 …Run Code Online (Sandbox Code Playgroud) 在mbrainz示例数据中,:artist/type是枚举.是否可以将枚举的值拉出:db/ident并使用pull语法将其作为:artist/type键的值关联?
这是我能得到的最接近的:
[:find (pull ?e [:artist/name {:artist/type [:db/ident]}])
 :where
 [?e :artist/name "Ray Charles"]
]
;;=> [[{:artist/name "Ray Charles", :artist/type {:db/ident :artist.type/person}}]]
Run Code Online (Sandbox Code Playgroud)
是否可以使用pull语法将结果重塑为类似的内容?
;;=> [[{:artist/name "Ray Charles", :artist/type :artist.type/person}]]
Run Code Online (Sandbox Code Playgroud) 所以我试图理解Datalog是如何工作的,它和Prolog之间的区别之一是它对否定和递归有分层限制.引用维基百科:
如果谓词P是从谓词Q中积极推导出来的(即,P是规则的头部,并且Q在同一规则的正文中是正的),那么P的分层数必须大于或等于分层Q的数量
如果谓词P来自否定谓词Q(即,P是规则的头部,并且Q在同一规则的主体中出现负面),那么P的分层数必须大于Q的分层数. ,
因此,通过这样,下面的两个谓词不会导致分层错误,因为它们可以简单地分配相同的分层数.所以这些谓词很好,尽管有圆形定义.
但是如果我们有一个含有一些否定的定义(其中〜是否定),则会发生什么
这里的分层是不可能的.A(x,y)必须具有大于B(x,y)的分层数,并且B(x,y)必须具有大于A(x,y)的分层数.我的第一个想法是,这不是正常的,因为这是一个循环定义,但只要谓词不被否定,分层就可以完成循环.但为什么?真值是简单的二元值.以这种方式处理具有不同符号的公式似乎是极其随意的.在第二种不是第一种情况的情况下,这种分层试图阻止的是什么?
我正在考虑使用数据记录作为我正在编写的应用程序的数据库后端,因为我认为可以让我轻松地在表示之间切换,而不必牺牲我收集的数据或编写繁琐的迁移.
但是,我无法预见我将如何处理更改数据 - 例如,用户可更改密码这样简单的事情.我有一个想法用日期标记行:
changepassword(<user>, <passhash>, <date>)
Run Code Online (Sandbox Code Playgroud)
然后使用最新的,但似乎没有办法获得最新的,没有返回所有行并在应用程序端过滤它们.
数据记录应用程序如何设计来处理变化的数据?
假设我有entry具有 ref-to-many 属性的实体:entry/groups。我应该如何构建查询以查找其:entry/groups属性包含我所有输入外部 ID 的实体?
下一个伪代码将更好地说明我的问题:
[2 3] ; having this as input foreign ids
;; and having these entry entities in db
[{:entry/id "A" :entry/groups  [2 3 4]}  
 {:entry/id "B" :entry/groups  [2]}     
 {:entry/id "C" :entry/groups  [2 3]}  
 {:entry/id "D" :entry/groups  [1 2 3]}
 {:entry/id "E" :entry/groups  [2 4]}] 
;; only A, C, D should be pulled
Run Code Online (Sandbox Code Playgroud)
作为 Datomic/Datalog 的新手,我用尽了所有选项,因此感谢您提供任何帮助。谢谢!
StreamReader sr = new StreamReader("C:/CR EZ Test/Log.txt");    //use with IF
private void timer2_Tick(object sender, EventArgs e)
{
    if ((line = sr.ReadLine()) != null)
    {   
        //FileStream fs = File.Open("C:/CR EZ Test/Log.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        //StreamReader sr = new StreamReader(fs); //use with While can't use with }else{
        //while ((line = sr.ReadLine()) != null) 
        //{
        string[] dataLog = line.Split(new[] { ',' }, StringSplitOptions.None);
        mpa = (dataLog[1]);
        ml  = (dataLog[2]);
        lph = (dataLog[3]);
        elapsedTime = float.Parse(dataLog[4]) / 1000;
        if (testStatus > 0) time = …Run Code Online (Sandbox Code Playgroud)