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

2024-01-11

与我之前的帖子相关:如何在 SWI Prolog 中参数化 SPARQL 查询? https://stackoverflow.com/questions/16820606/how-to-parameterize-a-sparql-query-in-swi-prolog/16822345?noredirect=1#comment24256405_16822345

为了练习,我尝试实现一个谓词,该谓词仅使用append/3谓词(与我旧帖子中提出的解决方案不同),但效果不佳。

这是我的谓词:

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/')] ).

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

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

问题是它似乎不起作用。在 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
    

正如您所看到的,它出现了错误。奇怪的是我的查询值(我使用 write/1 打印它)似乎没问题。事实上,如果我将 ASCII 列表翻译成字符,它的值为:

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

这是我原来的查询(所以看起来查询字符串将以正确的方式构建),但问题似乎出在其他查询上sparql_query/3参数,这很奇怪,因为它是从之前的帖子解决方案复制而来的,效果很好。为什么?我缺少什么?


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

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 字符串语法定义的其他特殊字符时,这才有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用append/3谓词创建SPARQL参数化查询 的相关文章

  • Prolog:覆盖谓词和使用它之间的区别

    我觉得自己真的很愚蠢 感觉自己错过了一些东西 我基本上有两个文件 module pl通用逻辑规则 可重用 state pl一个针对当前场景 在模块文件中 module pl 我已经声明 inside Food Eater T isTime
  • sparql 主题的完整树

    例如 当我有一个人图时 例如约翰和约翰有工作地址 家庭地址 电话号码 关系等 是否有可能在不知道它是什么的情况下检索与 john 及其子类相关的所有内容 这样我就可以检索例如以下内容 John lt address lt house num
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • 如何将嵌入的 Blazegraph 内容转储到 RDF 文件?

    I have 创建了 blazegraph RDF4J 存储库和连接 https wiki blazegraph com wiki index php Sesame API Tutorial在斯卡拉中 val props new Prope
  • Jena 桌面 SPARQL 客户端 (TDB)?

    我正在开发一个使用 Jena 进行存储 带有 TDB 后端 的应用程序 我正在寻找类似 Squirrel 的东西 它可以让我看到正在存储的内容 运行查询等 这似乎是一个明显需要的东西 但我的 可能措辞不好 谷歌查询没有出现任何有希望的东西
  • 三元组组合的递归 SPARQL 查询

    我使用onspy在Python中递归运行以下查询 SELECT c WHERE c rdfs subClassOf restriction restriction owl onProperty has part owl someValues
  • 关于构建列表直至满足条件

    我想解决 巨猫军团之谜 https youtu be YeMVoJKn1Tg由 Dan Finkel 使用 Prolog 编写 基本上你从 0 然后使用以下三个操作之一构建此列表 添加5 添加7 或采取sqrt 当您成功建立一个列表后 您就
  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • 如何在Prolog中编写cmp_list/3函数?

    Write a predicate cmp list 3 the first 2 arguments are 2 lists and the last one is Comparison which means ge lt le or gt
  • 使用 rdflib-sqlalchemy 的 SPARQL 查询性能

    我有 7200 个左右的 SKOS Concept 对象 由 rdflib sqlalchemy 通过解析存储在 Postgres DB 中的海龟文件创建 以下 SPARQL 查询需要 30 多秒才能响应数据 SELECT subject
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 在列表列表中查找形状

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N

随机推荐