我正在尝试将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 / ')]). Row = row(literal(type(' http://www.w3.org/2001/XMLSchema#integer ', ' 0'))) .
我不太清楚SPARQL,但我认为这很简单,并且以这种方式工作:
此查询询问实例在RDF本体上称为dbpedia的个人名称的对象数,并传递输入参数“Leonardo” .
你可以看到问题似乎找不到这种类型的任何实例(我也尝试过其他人的名字)
为什么?我错过了什么?
1 回答
您的查询不会返回您希望它返回的内容 . 您可以与DBpedia SPARQL endpoint交互使用SPARQL . 我建议您使用它来调试查询并确保它首先返回您想要的内容,然后将其复制到Prolog程序中 . 您可以将其逐块构建,以确保它能够提供合适的结果 . 例如,从以下内容开始:
SPARQL results
然后逐个展开:
SPARQL results
此查询不返回任何内容,因此最好在继续执行FILTER或COUNT之前对其进行调试 .
在使用 endpoints 播放一段时间之后,似乎使用REGEX会像其他字符串操作一样昂贵 . 如果你可以直接查询你想要的字符串,你可能会更好 . 不幸的是,您还需要开始使用语言标签 . 例如,这里有一个查询,用于计算具有给定名称或姓氏
"Leonardo"
的人 .SPARQL results
它返回
0
. 但是,如果我们为这些字符串添加(英语)语言标记,我们会得到不同的结果(133
):SPARQL results