0

我是 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"^^xsd:integer(因为month()函数返回一个整数),但它仍然失败。

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

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

在过去的两天里,我一直坚持这一点……我错过了什么吗?

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

4

1 回答 1

2

首先,您的查询中包含无效的语法,您不能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

所指的“原因”是导致向您显示的异常的异常。如果您使用代码提交查询,请捕获异常,并检查getCause()方法以查看是否有另一个异常对象。

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

问题不太可能出在过滤器上,因为 aFILTER由 SPARQL 规范定义,将表达式评估中的任何错误视为 a false

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

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

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

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
于 2015-02-08T02:13:19.977 回答