我正在开发一款音乐播放器应用程序,该应用程序依赖SPARQL来获取有关本地曲目的信息,但遇到了一些麻烦。
我正在运行Fedora 21,数据库(Tracker)是通过grilo查询的(即,我编写原始的SPARQL查询,grilo使用这些查询与数据库对话并发回任何结果)。
基本上,每当我尝试使用REPLACE
时,我都会得到以下结果:
Grilo-WARNING : [tracker-source-request] grl-tracker-source-api.c:500: Could not execute sparql query id=1: 1.273: syntax error, expected primary expression
当我尝试使用fn:replace
时,我得到的是:
Grilo-WARNING : [tracker-source-request] grl-tracker-source-api.c:500: Could not execute sparql query id=1: 1.284: syntax error, Unknown function
作为参考,以下是我尝试使用REPLACE
:的上下文
SELECT DISTINCT
rdf:type(?album)
tracker:id(?album) AS id
(
SELECT
nmm:artistName(?artist)
WHERE {
?album nmm:albumArtist ?artist
}
LIMIT 1
) AS artist
REPLACE(nie:title(?album)^^xsd:string, "hello", "goodbye") AS title
nie:title(?album) AS album
[more SPARQL gobbldygook follows]
如果您想了解其他查询的外观,请查看整个文件。
最终目标是使用REPLACE
从专辑/艺术家名称中去掉标点符号以进行排序。
谢谢!
您没有给我们一个最简单的例子,但至少您的部分问题是在查询和投影变量中尝试将属性视为函数。你不会写这样的东西:
select rdf:type(?album) where { ... }
选择rdf:type属性的值?相册。取而代之的是:
select ?type where { ?album rdf:type ?type }
您向我们展示的代码块可能应该是这样的:
select distinct ?type ?id (?title as ?albumTitle)
where {
?album rdf:type ?type ;
tracker:id ?id ;
nie:title ?title ;
nmm:albumArtist ?artist .
}
那么多就需要选择价值观了。现在,要将标题中出现的"你好"替换为"再见",您可以执行以下操作:
select distinct
?type
?id
(replace(?title,"hello","goodbye") as ?albumTitle)
where {
?album rdf:type ?type ;
tracker:id ?id ;
nie:title ?title ;
nmm:albumArtist ?artist .
}
现在,端点可能支持其他功能。因此,例如,端点可能有一个函数nie:title,用于传递IRI并获得标题。如果是这样的话,您仍然需要使用正确的SPARQL语法,并执行以下操作之一:
bind(nie:title(?album) as ?title)
在查询或中
select ... (nie:title(?album) as ?title) ... where { ... }
在查询中。nie:title(…)周围的括号为?title是强制性的。(有些端点可能不会强制执行所有语法,但规范中的是。)
Tracker还不支持此功能。
最近在bugzilla中添加了一个补丁来引入这一功能。我们应该在1.4.0(稳定)或更高版本(如1.3.5)中看到这一点。
此修补程序的错误如下:https://bugzilla.gnome.org/show_bug.cgi?id=745917