带有过滤器的SPARQL查询特定日期

时间:2015-02-07 20:53:25

标签: filter sparql jena fuseki

我是SPARQL的新手,我正在尝试为我的任务做以下事情:

我需要拔出演员,但只有那些出生在规定日期的演员。我的问题是,每当我尝试按某个整数值进行过滤时,我会收到“查询错误,查看详细原因”(顺便说一下,我不知道这个问题是什么“原因”,没有错误日志,或任何可以点击我实际检查出错的地方。

这是我的问题:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX db: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?actor ?dbpediaLink ?name ?date month(?date) WHERE {
        ?actor a movie:actor .
        ?actor owl:sameAs ?dbpediaLink .
    SERVICE <http://dbpedia.org/sparql> {
        ?dbpediaLink dbpprop:name ?name .
        ?dbpediaLink dbpprop:dateOfBirth ?date
    }
    FILTER(month(?date) = 2)
}
LIMIT 10

所以,我在这里要做的就是让所有演员都在二月出生,并且我得到了上面提到的错误。

FILTER的以下组合会返回上述错误:

FILTER(month(?date) = 2)
FILTER(month(?date) > 1 && month(?date) < 3)
FILTER(month(?date) >= 2 && month(?date) <=2)

基本上,只有2月份出生的人才能收回错误。我甚至尝试将整数显式地转换为"2"^^xsd:integer(因为month()函数返回一个整数)并且它仍然失败。

我也试过(对于其他一些问题)让演员名字中只有10个字母,但我也遇到了同样的问题。

似乎我尝试使用FILTER或尝试=多个条件(使用FILTER)的&&失败。

过去两天我坚持这个......我错过了什么?

我应该提一下,我正在使用本地部署的Fuseki服务器和LMDB转储,我在http://localhost:3030运行查询

1 个答案:

答案 0 :(得分:2)

要在查询中包含无效语法,您不能将month(?date)直接放在SELECT子句中,因为必须将括号括起来(和{{1}使用)对其进行别名,例如 -

AS

引用的“原因”是导致向您显示异常的异常。如果您使用代码提交查询,请捕获异常,并检查PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX movie: <http://data.linkedmdb.org/resource/movie/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX db: <http://dbpedia.org/ontology/> PREFIX dbpprop: <http://dbpedia.org/property/> prefix xsd: <http://www.w3.org/2001/XMLSchema#> SELECT ?actor ?dbpediaLink ?name ?date (month(?date) AS ?month) WHERE { ?actor a movie:actor . ?actor owl:sameAs ?dbpediaLink . SERVICE <http://dbpedia.org/sparql> { ?dbpediaLink dbpprop:name ?name . ?dbpediaLink dbpprop:dateOfBirth ?date } FILTER(month(?date) = 2) } LIMIT 10 方法以查看是否存在其他异常对象。

请注意,如果您使用的是标准的Fuseki设置,则可能会在启动Fuseki服务器的终端窗口中记录更多错误信息(或者您重定向该服务器处理输出的位置)。

问题不太可能是过滤器,因为SPARQL规范定义getCause()将表达式评估中的任何错误视为FILTER

如果问题不仅仅是你的错误语法,那么最可能的罪魁祸首就是查询中的false子句,要求Fuseki从SERVICE查询一些信息。定义http://dbpedia.org/sparql,如果联系远程服务失败,则整个查询失败。因此,很可能您无法从您的计算机访问该服务,或者DBPedia端出现错误导致问题(这是闻所未闻的)。

您可以在浏览器中浏览该网址吗?如果可以,您是否能够使用Web界面成功运行查询中出现在SERVICE子句中的部分?

请注意,您可以在SERVICE关键字之后添加SILENT关键字,即使远程服务请求失败,也会导致查询引擎继续运行,例如: -

SERVICE