1

我正在尝试将 SPARQL 查询集成到 Prolog 程序中(我正在使用 SWI-Prolog)

为了测试它,我正在执行以下操作:

  1. 进入 SWI-Prolog shell 我执行这个命令:use_module(library(semweb/sparql_client))。加载 sparql 客户端库

  2. 然后,在 SWI-Prolog shell 中,我执行以下 SPARQL 查询:

    ?- sparql_query('select count(*) where { ?person a http://dbpedia.org/ontology/Person .?person http://it.dbpedia.org/property/nome ?name.filter regex(?name “莱昂纳多”)。}',行,[主机('dbpedia.org'),路径('/sparql/')])。行=行(文字(类型(' http://www.w3.org/2001/XMLSchema#integer','0 ')))。

我不太了解 SPARQL,但我认为这很简单,并且以这种方式工作:

此查询询问在称为 dbpedia 的 RDF 本体上被视为个人名称的对象的实例数,并传递输入参数“Leonardo”。

如您所见,问题似乎没有找到这种类型的任何实例(我也尝试过使用其他人的姓名)

为什么?我错过了什么?

4

1 回答 1

5

您的查询不会返回您希望它返回的内容。您可以将 SPARQL 与DBpedia SPARQL 端点交互使用。我建议您使用它来调试您的查询并确保它首先返回您想要的内容,然后将其复制到您的 Prolog 程序中。您可以将其分段构建,以确保它提供合适的结果。例如,从以下内容开始:

select * where {
  ?person a <http://dbpedia.org/ontology/Person> .
}
LIMIT 10

SPARQL 结果

然后逐个展开:

select * where {
  ?person a <http://dbpedia.org/ontology/Person> .
  ?person <http://it.dbpedia.org/property/nome> ?name .
}
LIMIT 10

SPARQL 结果

此查询不返回任何内容,因此最好在继续使用 FILTER 或 COUNT 之前对其进行调试。

在使用端点一段时间后,使用 REGEX 似乎会有点昂贵,其他字符串操作也是如此。如果你可以直接查询你想要的字符串,你可能会更好。不幸的是,您也需要开始使用语言标签。例如,这里有一个查询给定 name 或 surname 的人数"Leonardo"

select COUNT(?person) where {
  ?person a dbpedia-owl:Person .
  { ?person foaf:givenName "Leonardo" }
  UNION 
  { ?person foaf:surname "Leonardo" }
}

SPARQL 结果

它返回0。但是,如果我们在这些字符串中添加(英语)语言标签,我们会得到不同的结果(133):

select COUNT(?person) where {
  ?person a dbpedia-owl:Person .
  { ?person foaf:givenName "Leonardo"@en }
  UNION 
  { ?person foaf:surname "Leonardo"@en }
}

SPARQL 结果

于 2013-05-28T16:10:52.930 回答