0

我正在开发一个音乐播放器应用程序,该应用程序依赖于 SPARQL 来获取有关本地曲目的信息,并且遇到了一些麻烦。

我正在运行 Fedora 21,并通过 grilo 查询数据库(Tracker)(即,我编写原始 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从专辑/艺术家名称中去除标点符号以进行排序。

谢谢!

4

2 回答 2

0

Tracker 还不支持这个。

最近有一个补丁添加到 bugzilla 以引入此功能。我们应该在 1.4.0(稳定)或更高版本的不稳定版本(如 1.3.5)中看到这一点。

此补丁的错误在这里: https ://bugzilla.gnome.org/show_bug.cgi?id=745917

于 2015-03-11T20:57:40.890 回答
0

你没有给我们一个最小的例子来处理,但至少你的问题的一部分是试图将属性视为函数,无论是在查询中还是在投影变量中。你不会写这样的东西:

select rdf:type(?album) where { ... }

为?album选择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 .
}

这将照顾选择值。现在,要将标题中出现的“hello”替换为“goodbye”,您可以:

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是强制性的。(某些端点可能不会强制执行所有语法,但它规范中。)

于 2015-03-05T19:56:13.470 回答