【问题标题】:SPARQL fn:replace thorws error: "syntax error, expected primary expression"SPARQL fn:replace thorws 错误:“语法错误,预期的主表达式”
【发布时间】:2015-03-03 17:44:39
【问题描述】:

我正在开发一个依赖 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]

如果您想了解其他查询的外观,view the whole file

最终目标是使用REPLACE 去除专辑/艺术家名称中的标点符号以进行排序。

谢谢!

【问题讨论】:

  • 不太确定我是否了解您的完整设置,但是您在问题中的查询不是合法的标准 SPARQL - 除了没有 rdf:typetracker:id 函数(虽然这些可能已被您使用的 SPARQL 引擎添加为自定义扩展),但您在 SELECT 子句中的各个部分周围缺少左括号和右括号(基本上,每个涉及 AS 别名的子句元素都应该用括号括起来)。
  • REPLACE 是在 SPARQL 1.1 修订版中添加的函数。也许您的查询引擎与修订后的规范不完全兼容?

标签: sparql tracker fedora-21


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Tracker 还不支持此功能。

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

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

    【讨论】:

    • 该错误目前已解决。
    猜你喜欢
    • 2021-11-16
    • 2021-08-30
    • 2019-02-20
    • 1970-01-01
    • 2023-04-11
    • 2016-06-03
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多