使用append / 3谓词创建SPARQL参数化查询

时间:2013-05-30 10:07:30

标签: prolog swi-prolog sparql

与我之前的帖子相关:How to parameterize a SPARQL query in SWI Prolog?

为了练习,我试图实现一个谓词,它只使用 append / 3 谓词构建并执行SPARQL查询(与旧帖子中提出的解决方案不同)但它没有工作得很好。

这是我的谓词:

buildQuery(Place, Query, Row) :- 

    % Q1 = 'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "
    Q1 = [39, 115, 101, 108, 101, 99, 116, 32, 67, 79, 85, 78, 84, 40, 42, 41, 32, 119, 104, 101, 114, 101, 32, 123, 63, 112, 108, 97, 99, 
              101, 32, 97, 32, 100, 98, 112, 101, 100, 105, 97, 45, 111, 119, 108, 58, 80, 108, 97, 99, 101, 32, 59, 32, 114, 100, 102, 115, 58,
              108, 97, 98, 101, 108, 32, 34],
    append(Q1, Place, Q2),
    %End = @en }}'
    End = [34, 64, 105, 116, 32, 125, 39],

    append(Q2, End, Query),
    sparql_query(Query, Row, [ host('dbpedia.org'), path('/sparql/')] ).

因为我发现将字符直接插入字符串时出现了一些问题。(也就是说,将插入"";也许我可以放一个字符进入"",代表字符串的开头和结尾,以某种方式转义它。我不知道。)

我正在尝试以下列方式构建我的查询: 在Prolog中,字符串是ASCII字符列表,因此我创建了一个字符串\ list Q1 ,表示字符串:'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label ",这是我查询的第一部分。然后我附加 Place 变量的值,该变量将是表示地点的字符串(例如,"Roma"),创建新字符串 Q2 。然后我将结束字符串附加到Q2,创建最终查询查询,其中结束是我查询的最后一部分:%End = @en}}'最后,我通过谓词中内置的 sparql_query / 3 执行SPARQL查询,并将其传递给我的最终查询查询,以及需要其他两个参数(如上一篇文章的良好工作示例)。

问题在于它似乎不起作用。在Prolog shell中,我执行以下命令:

  1. 加载所需的SPARQL库:

    ?- use_module(library(semweb/sparql_client)).
    %   library(uri) compiled into uri 0.02 sec, 290,256 bytes
    %   library(readutil) compiled into read_util 0.00 sec, 17,464 bytes
    %   library(socket) compiled into socket 0.00 sec, 11,936 bytes
    %   library(option) compiled into swi_option 0.00 sec, 14,288 bytes
    %   library(base64) compiled into base64 0.01 sec, 17,912 bytes
    %   library(debug) compiled into prolog_debug 0.00 sec, 21,864 bytes
    %  library(http/http_open) compiled into http_open 0.03 sec, 438,368 bytes
    %   library(sgml) compiled into sgml 0.01 sec, 39,480 bytes
    %     library(quintus) compiled into quintus 0.00 sec, 23,896 bytes
    %    rewrite compiled into rewrite 0.00 sec, 35,336 bytes
    %    library(record) compiled into record 0.00 sec, 31,368 bytes
    %   rdf_parser compiled into rdf_parser 0.01 sec, 132,840 bytes
    %    library(gensym) compiled into gensym 0.00 sec, 4,792 bytes
    %   rdf_triple compiled into rdf_triple 0.00 sec, 39,672 bytes
    %  library(rdf) compiled into rdf 0.02 sec, 244,240 bytes
    % library(semweb/sparql_client) compiled into sparql_client 0.06 sec, 707,080 bytes
    true.
    
  2. 我执行我的谓词:

    ?- buildQuery("Roma", Query, Row), write(Query).
    ERROR: uri:uri_query_components/2: Type error: `atomic' expected, found `[39,115,101,108,101,99,116,32,67,79,85,78,84,40,42,41,32,119,104,101,114,101,32,123,63,112,108,97,99,101,32,97,32,100,98,112,101,100,105,97,45,111,119,108,58,80,108,97,99,101,32,59,32,114,100,102,115,58,108,97,98,101,108,32,34,82,111,109,97,34,64,105,116,32,125,39]'
    ^  Exception: (12) ignore(http_open:parts_search([protocol(http), host('dbpedia.org'), port(80), path('/sparql/'), search([...])], _G1079)) ? creep
    
  3. 如您所见,它会出错。奇怪的是我的查询值(我使用write / 1打印)似乎没问题。实际上,如果我将ASCII列表转换为字符,则其值为:

    '选择COUNT(*)其中{?放置一个dbpedia-owl:Place; rdfs:标签“罗马”@it}'

    这是我的原始查询(因此看起来查询字符串将以正确的方式构建)但似乎问题出现在其他 sparql_query / 3 参数中,这很奇怪,因为它是从以前的后期解决方案复制,效果很好。为什么?我错过了什么?

1 个答案:

答案 0 :(得分:1)

您收到错误,因为sparql_query / 3的Query(first)参数是一个原子。因此,构建查询的最简单方法是

atomic_list_concat([ 'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "',
                     Place,
                     '"@en }'
                   ], Query),
sparql_query(Query, Row, [ host('dbpedia.org'), path('/sparql/')] ).

请注意,只有在Place des不包含双引号或SPARQL字符串语法定义的其他特殊字符时,此方法才有效。