ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-11-23 06:18:00  阅读:261  来源: 互联网

标签:swi-prolog data-conversion prolog mysql


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

标签:swi-prolog,data-conversion,prolog,mysql
来源: https://codeday.me/bug/20191123/2065544.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有