我仍在思考如何将Datalog程序的递归转换为SQL,例如
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
Run Code Online (Sandbox Code Playgroud)
A/1EDB谓词在哪里。这与P和之间存在相互依赖关系Q。对于较长的查询,该如何解决?
而且,有没有什么系统可以完全实现翻译?如果有,我可以知道我要使用的系统或论文吗?
我想在谓词规则的主体中使用全称量词,例如
A(x,y) <- ?B(x,a), C(y,a)。
这意味着只有对于来自 C(y, a ) 的每个a,B(x, a ) 总是有 x 匹配 (x, a ),那么 A(x,y) 为真。
由于在 Datalog 中,规则体中的每个变量默认都是存在量词,因此a也将是存在量词。我应该怎么做才能在谓词规则的主体中表达全称量词?
谢谢你。
PS 我使用的 Datalog 引擎是 logicblox。
LogicBlox数据库是使用LogiQL语言编写的,这是根据他们的网站某种Datalog变种:
应用程序使用LogiQL语言编写,这是Datalog的扩展版本
Datalog和LogiQL之间究竟有什么区别?
我想在下一个查询中找到年龄最小的人
(d/q '[:find ?name (min ?age)
:in [[?name ?age]]]
[["John" 20]
["Bill" 25]
["Jack" 20]
["Steve" 28]
["Andrew" 30]])
Run Code Online (Sandbox Code Playgroud)
但结果是
[["Andrew" 30] ["Bill" 25] ["Jack" 20] ["John" 20] ["Steve" 28]]
Run Code Online (Sandbox Code Playgroud)
怎么做?
是否准确地说,在现有的图查询语言(Cypher、Datalog、Sparql 等)中,Gremlin 是唯一一种图灵完备的语言?
如果重要的话,我并不是在寻找像《万智牌》的图灵完备性证明这样的边缘情况;我的问题的目的是 Gremlin 是否是唯一适合在实践中对图执行任意计算的图查询语言。
我有以下事实和规则:
% frequents(D,P) % D=drinker, P=pub
% serves(P,B) % B=beer
% likes(D,B)
frequents(janus, godthaab).
frequents(janus, goldenekrone).
frequents(yanai, goldenekrone).
frequents(dimi, schlosskeller).
serves(godthaab, tuborg).
serves(godthaab, carlsberg).
serves(goldenekrone, pfungstaedter).
serves(schlosskeller, fix).
likes(janus, tuborg).
likes(janus, carlsberg).
count_good_beers_for_at(D,P,F) :- group_by((frequents(D,P), serves(P,B), likes(D,B)),[D,P],(F = count)).
possible_beers_served_for_at(D,P,B) :- lj(serves(P,B), frequents(D,R), P=R).
Run Code Online (Sandbox Code Playgroud)
现在我想构建一个规则,当每个酒吧的“饮酒者”“频率”大于 0 的可用“喜欢”啤酒的数量时,该规则应该像一个返回“真”的谓词一样工作。
当规则不返回元组时,我会认为谓词为真。如果谓词为假,我打算让它返回没有单一“喜欢”啤酒的酒吧。
如您所见,我已经制定了一个规则,可以计算特定酒吧中特定饮酒者的优质啤酒。我也有一个规则,给我提供啤酒的数量。
DES> count_good_beers_for_at(A,B,C)
{
count_good_beers_for_at(janus,godthaab,2)
}
Info: 1 tuple computed.
Run Code Online (Sandbox Code Playgroud)
如您所见,柜台没有返回经常光顾的酒吧,但有 0 个喜欢的啤酒。我计划通过使用左外连接来解决这个问题。
DES> is_happy_at(D,P,Z) :- lj(serves(P,B), count_good_beers_for_at(D,Y,Z), (Y=P))
Info: Processing:
is_happy_at(D,P,Z) :-
lj(serves(P,B),count_good_beers_for_at(D,Y,Z),Y = P).
{
is_happy_at(janus,godthaab,2),
is_happy_at(null,goldenekrone,null),
is_happy_at(null,schlosskeller,null)
}
Info: …Run Code Online (Sandbox Code Playgroud) 我目前正在评估 Datomic 用于存储和查询构成本体的已解析符号的用例。数据库中总共有 225122 个符号(实体)(所以它是一个相当大的本体,但对于 DB 来说应该不是什么大问题)。
结构非常标准,符号有
为了更好地访问符号,我们name为每个符号设置了唯一的。这加起来就是以下 Datomic 模式:
[{:db/ident :ml/name,
:db/valueType :db.type/string,
:db/cardinality :db.cardinality/one,
:db/unique :db.unique/identity}
{:db/ident :ml/parent,
:db/valueType :db.type/ref,
:db/index true,
:db/cardinality :db.cardinality/one}
{:db/ident :ml/superclass,
:db/valueType :db.type/ref,
:db/index true,
:db/cardinality :db.cardinality/one}]
Run Code Online (Sandbox Code Playgroud)
现在我有了最基本的递归查询“给我所有(传递)包含在符号中的符号p”。在数据方面:
(def rules
'[
[(ubersymbol ?c ?p) (?c :ml/parent ?p)]
[(ubersymbol ?c ?p) (?c :ml/parent ?c1) (ubersymbol ?c1 ?p) ]
])
(q '[:find ?c ?n :in $ % :where
(ubersymbol ?c ?d) [?d :ml/name "name of …Run Code Online (Sandbox Code Playgroud) datomic 支持子查询还是可以在查询中模拟?那本质上是一个:find内在另一个:find。
我正在尝试在查询/数据库本身而不是在应用程序中执行数据的分析转换。
我正在寻找一个关于如何实现基本数据记录解释器以用于学习目的的好教程。我发现了很多论文讨论如何使它们更快或添加一些功能,但没有一篇描述如何实现基本功能。
我一直试图了解在特定的上下文中使用Prolog而不是Datalog是否有很大的优势.Prolog是图灵完整而Datalog不是.但使用Prolog还有其他实质性优势吗?
具体的上下文可以是例如关系数据库......最好使用Prolog或Datalog?