为什么这个SPARQL查询不能用于Prolog?

时间:2013-05-28 15:04:29

标签: prolog sparql semantic-web

我正在尝试将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,“Leonardo”)。}',Row, [host('dbpedia.org'),path('/ sparql /')])。 行=行(文字(类型('http://www.w3.org/2001/XMLSchema#integer','0')))。

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

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

    正如您所看到的那样,问题似乎找不到任何此类型的实例(我也尝试过其他个人姓名)

    为什么呢?我错过了什么?

1 个答案:

答案 0 :(得分:5)

您的查询未返回您想要返回的内容。您可以使用DBpedia SPARQL endpoint以交互方式使用SPARQL。我建议您使用它来调试查询并确保它首先返回您想要的内容,然后将其复制到Prolog程序中。您可以将它构建成碎片以确保它能够提供合适的结果。例如,从以下内容开始:

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

SPARQL results

然后逐一展开:

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

SPARQL results

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

在使用端点播放一段时间后,似乎使用REGEX会像其他字符串操作一样昂贵。如果你可以直接查询你想要的字符串,你可能会更好。不幸的是,您还需要开始使用语言标签。例如,这是一个查询,它使用给定名称或姓氏"Leonardo"计算人员。

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

SPARQL results

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

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

SPARQL results