gpt4 book ai didi

mysql - 将 MySQL 数据转换为 Prolog 规则以进行探索性挖掘的任何特定规则?

转载 作者:可可西里 更新时间:2023-11-01 08:18:37 24 4
gpt4 key购买 nike

我有三个表(目前),一个有 2000 行,另外两个各有大约 160 万行。它们具有将它们相互关联的列,但它们不是正式的 FK 字段。我编写了一个 C++ 程序来生成基于源 MySQL 数据的规则文件,如下所示:

if T{ C1, C2...Cn } is the table definition
then the rule would be:
T(C1, C2, Cn).

我的转换实用程序保留整数未包装,其他任何内容都放在单引号内,因此 INT(n)、DECIMAL 等成为 Prolog 数字,其他所有内容都是原子。

我的问题是:如果我想为具有 26 个字段的表/规则编写搜索规则,是否有“元级”方式来表达这一点:

findStuffById(I,FieldIWant1,FieldIwant2etc) :-
tablename(_,_,I,_,FieldIWant1,_,_,_FieldIWant2etc,_,_,....).

还是我必须创建“更简单”的规则,然后必须使用“_”或变量来捕获我想要的内容?

编写规则的前景...

findThisById(X)     :- tablename(X,_,_,_,_,This,_,_).
findThatById(X) :- tablename(X,_,_,That,_,_,_,_).
findTheOtherById(X) :- tablename(X,_,_,_,_,_,_,TheOther).

...令人作呕...令人不安!

到目前为止,我唯一的想法是我可能需要在规则中创建复合术语以将事物组合在一起,即减少规则中变量的数量,但这可能会限制 future 查询的“自由度”?我不是 Prolog 专家;我已经使用它玩了几个小时,并且非常想在我自己的日常工作中找到一个真实的用途。

我想我的转换程序也可以通过代码生成苦工规则,这样我就不必手动编写代码了。大表各有 26 列和 28 列,因此您可以看到这是怎么回事!

欢迎就如何进行提出任何建议;我没有像我想的那样经常使用 Prolog,我一直想学习更多!

我想创建一个 SWI-Prolog 网络服务器,它将使用相同的原始数据与 ElasticSearch 服务器进行正面交锋,看看哪个服务器对临时查询的响应速度最快。似乎 ES 也不进行传统连接,除非您预先创建一个嵌入索引的复合文档,这也可能有利于使用 Prolog。

谢谢。肖恩。

最佳答案

您可以使用 nth1/1 和“univ”运算符,执行如下操作:

fieldnames(t, [id,this,that]).
get_field(Field, Tuple, Value) :-
Tuple =.. [Table|Fields],
fieldnames(Table, Names),
nth1(Idx, Names, Field),
nth1(Idx, Fields, Value).

您需要为每个表结构创建 fieldnames/2 记录,并且您必须将表结构传递给此查询。它不会非常有效,但它会起作用。

?- get_field(this, t(testId, testThis, testThat), Value)
Value = testThis

然后您可以很容易地在此基础上构建您的访问器:

findThisById(X, This) :- get_field(this, X, This).

编辑:Boris 正确地指出 arg/3 将以更少的工作完成此任务:

get_field(Field, Tuple, Value) :-
functor(Tuple, Table, _),
fieldnames(Table, Names),
nth1(Idx, Names, Field),
arg(Idx, Tuple, Value).

序言太棒了。

关于mysql - 将 MySQL 数据转换为 Prolog 规则以进行探索性挖掘的任何特定规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com