是否有将MySQL数据转换为Prolog规则以进行探索性挖掘的特定规则?

我有三个表(目前),一个表具有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).

…令人作呕的…令人不安!

到目前为止,我唯一的想法就是可能需要在规则内创建复合词以将事物组合在一起,即减少规则中变量的数量,但这可能会限制将来查询的“*度”?我不是Prolog专家;我已经玩了好几个小时,并渴望在自己的日常工作中找到现实的用途.

我想我的转换程序也可以通过代码来生成繁琐的规则,这样我就不必手工编写代码了.大表分别具有26和28列,因此您可以看到前进的方向!

任何有关如何进行的建议都将受到欢迎;我没有尽可能多地使用Prolog,而且我一直想了解更多信息!

我想创建一个SWI-Prolog Web服务器,该服务器将使用相同的原始数据与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).

Prolog非常棒.

上一篇:天轰穿·甜老丝儿。科创少年---关于编程语言


下一篇:从php在服务器上运行prolog(或使其成为守护进程)