0

I'm working on a music player app that relies on SPARQL to get information about local tracks, and have been running into some trouble.

I'm running Fedora 21, and the database (Tracker) is queried via grilo (i.e., I write raw SPARQL queries, and grilo uses these queries to talk to the database and sends back any results).

Basically, any time I try to use REPLACE, I get the following:

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

When I attempt to use fn:replace, I instead get:

Grilo-WARNING : [tracker-source-request] grl-tracker-source-api.c:500: Could not execute sparql query id=1: 1.284: syntax error, Unknown function

For reference, here's the context in which I'm attempting to use 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]

If you want a sense of what the other queries look like, view the whole file.

The ultimate goal is to use REPLACE to strip off punctuation from album/artist names for sorting purposes.

Thanks!

4

2 に答える 2

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 .
}

それだけで、値の選択に気を配ることができます。ここで、タイトルの「こんにちは」を「さようなら」に置き換えるには、次のようにします。

select distinct
  ?type
  ?id
  (replace(?title,"hello","goodbye") as ?albumTitle)
where {
  ?album rdf:type ?type ;
         tracker:id ?id ;
         nie:title ?title ;
         nmm:albumArtist ?artist .
}

現在、エンドポイントが追加機能をサポートしている可能性があります。したがって、たとえば、IRI を渡してタイトルを取得する関数nie:titleがエンドポイントにある可能性があります。その場合でも、適切な SPARQL 構文を使用し、次のいずれかを行う必要があります。

bind(nie:title(?album) as ?title)

クエリまたは

select ... (nie:title(?album) as ?title) ... where { ... }

クエリで。?title として nie:title(…) を囲む括弧は必須です。(一部のエンドポイントでは、すべての構文が強制されない場合がありますが、仕様に含まれています。)

于 2015-03-05T19:56:13.470 に答える