带有特定日期过滤器的 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
我是 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