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

SPARQL query with filter for a certain date

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

我需要提取演员,但只提取那些在指定日期出生的演员。我的问题是,每次我尝试按某个整数值进行过滤时,我都会得到 "Error making the query, see cause for details"(顺便说一句,我不知道 "cause" 是什么,没有错误日志,也没有任何可点击的内容让我实际检查出了什么问题)。

这是我的查询:

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 return 提到的错误:

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

基本上所有的变体都是为了找回二月出生的人 return 的错误。我什至尝试将整数显式转换为 "2"^^xsd:integer(因为 month() 函数 return 是一个整数),但它仍然失败。

我也尝试(针对其他一些问题)让演员的名字正好有 10 个字母,但我也 运行 遇到了同样的问题。

似乎我尝试使用 = 或通过多种条件(使用 &&)尝试 FILTER 的任何 FILTER 都失败了。

过去 2 天我一直在做这个...我是不是漏掉了什么?

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

处的查询

首先,您的查询中包含无效语法,您不能将 month(?date) 直接放在 SELECT 子句中,因为您必须将其括在圆括号中 - () - 并使用 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

所指的"cause"是导致显示给您的异常的异常。如果是使用代码提交查询,捕获异常,检查getCause()方法看是否有另一个异常对象。

请注意,如果您使用的是标准 Fuseki 设置,可能会有更多错误信息记录到您启动 Fuseki 服务器的终端 window(或您将服务器处理输出重定向到的任何位置)。

问题不太可能出在过滤器上,因为 SPARQL 规范定义了 FILTER,将表达式计算中的任何错误视为 false

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

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

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

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 SILENT <http://dbpedia.org/sparql> {
        ?dbpediaLink dbpprop:name ?name .
        ?dbpediaLink dbpprop:dateOfBirth ?date
    }
    FILTER(month(?date) = 2)
}
LIMIT 10