我是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运行查询
答案 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