我正在尝试将SPARQL查询集成到Prolog程序中(我正在使用SWI-Prolog)
要测试它,我正在执行以下操作:
进入SWI-Prolog shell我执行以下命令: use_module(library(semweb / sparql_client))。加载sparql客户端库
然后,在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')))。
我不太了解SPARQL,但我认为这很简单,并且以这种方式工作:
此查询询问实例在RDF本体上被称为dbpedia的个人名称的对象数,并传递输入参数“Leonardo”。
正如您所看到的那样,问题似乎找不到任何此类型的实例(我也尝试过其他个人姓名)
为什么呢?我错过了什么?
答案 0 :(得分:5)
您的查询未返回您想要返回的内容。您可以使用DBpedia SPARQL endpoint以交互方式使用SPARQL。我建议您使用它来调试查询并确保它首先返回您想要的内容,然后将其复制到Prolog程序中。您可以将它构建成碎片以确保它能够提供合适的结果。例如,从以下内容开始:
select * where {
?person a <http://dbpedia.org/ontology/Person> .
}
LIMIT 10
然后逐一展开:
select * where {
?person a <http://dbpedia.org/ontology/Person> .
?person <http://it.dbpedia.org/property/nome> ?name .
}
LIMIT 10
此查询不会返回任何内容,因此最好在继续使用FILTER或COUNT之前对其进行调试。
在使用端点播放一段时间后,似乎使用REGEX会像其他字符串操作一样昂贵。如果你可以直接查询你想要的字符串,你可能会更好。不幸的是,您还需要开始使用语言标签。例如,这是一个查询,它使用给定名称或姓氏"Leonardo"
计算人员。
select COUNT(?person) where {
?person a dbpedia-owl:Person .
{ ?person foaf:givenName "Leonardo" }
UNION
{ ?person foaf:surname "Leonardo" }
}
返回0
。但是,如果我们为这些字符串添加(英语)语言标记,我们会得到不同的结果(133
):
select COUNT(?person) where {
?person a dbpedia-owl:Person .
{ ?person foaf:givenName "Leonardo"@en }
UNION
{ ?person foaf:surname "Leonardo"@en }
}