2017-02-02 9 views
0

私はSPARQLの初心者です。私はSpanish National Libraryのエンドポイントに対処しようとしています。SPARQLのGroup_concat

prefix bne: <http://datos.bne.es/def/> # base URI for ontology documented at http://datos.bne.es/def/ 
prefix resource: <http://datos.bne.es/resource/> 
select distinct 
?book 
?author 
?title 
?subtitle 
?ISBN 
?publisher 
?date 
?pags 
?size 
?series 
?edition 
?subjectLabel 
where { 
?book a bne:C1003 . 
?book bne:P3001 "Errata Naturae" . 
?book bne:P1011 ?author . 
?book bne:P3002 ?title . 
OPTIONAL { ?book bne:P3013 ?ISBN } 
OPTIONAL { ?book bne:P3001 ?publisher } 
OPTIONAL { ?book bne:P3006 ?date } 
OPTIONAL { ?book bne:P3004 ?pags } 
OPTIONAL { ?book bne:P3007 ?size } 
OPTIONAL { ?book bne:P3016 ?series } 
OPTIONAL { ?book bne:P1004 ?date } 
OPTIONAL { ?book bne:P3017 ?edition } 
OPTIONAL { ?book bne:P3014 ?subtitle } 
OPTIONAL { ?book bne:OP3008 ?subject } 
?subject rdfs:label ?subjectLabel 
} 
limit 50 

しかし、いくつかの本が二つ以上の科目を持っているとして、SPARQLは結果でそれらを繰り返し:

私は動作するコードを持って、ここにあります。私はgroup_concatを使用しますが、何らかの理由でそれは動作しません:

prefix bne: <http://datos.bne.es/def/> # base URI for ontology documented at http://datos.bne.es/def/ 
prefix resource: <http://datos.bne.es/resource/> 
select distinct 
?book 
?author 
?title 
?subtitle 
?ISBN 
?publisher 
?date 
?pags 
?size 
?series 
?edition 
(GROUP_CONCAT(DISTINCT(?subjectLabel); separator="//") as ?subjects) 
where { 
?book a bne:C1003 . 
?book bne:P3001 "Errata Naturae" . 
?book bne:P1011 ?author . 
?book bne:P3002 ?title . 
OPTIONAL { ?book bne:P3013 ?ISBN } 
OPTIONAL { ?book bne:P3001 ?publisher } 
OPTIONAL { ?book bne:P3006 ?date } 
OPTIONAL { ?book bne:P3004 ?pags } 
OPTIONAL { ?book bne:P3007 ?size } 
OPTIONAL { ?book bne:P3016 ?series } 
OPTIONAL { ?book bne:P1004 ?date } 
OPTIONAL { ?book bne:P3017 ?edition } 
OPTIONAL { ?book bne:P3014 ?subtitle } 
OPTIONAL { ?book bne:OP3008 ?subject } 
?subject rdfs:label ?subjectLabel 
} 
limit 50 
group by ?book 
order by ?date 

誰かが、私は間違いを犯していますどこを知っていますか?

ありがとうございます!

編集:

私が間違っている一つのことをやっていた:@AKSWが言ったように、私はグループに、コードの末尾にすべての変数を持っている、または選択に変数を追加します。私はこれをテストするためのコードの縮小版を持っている:

PREFIX bne: <http://datos.bne.es/def/> 
PREFIX resource: <http://datos.bne.es/resource/> 

SELECT ?book ?author ?title (GROUP_CONCAT(DISTINCT ?subject ; separator='//') AS ?subjects) 
WHERE 
    { ?book a      bne:C1003 ; 
      bne:P3001    "Errata Naturae" ; 
      bne:P1011    ?author ; 
      bne:P3002    ?title ; 
      bne:OP3008   ?subject 
    } 
#group everything here 
GROUP BY ?book ?author ?title 

@JeenBroekstra、私はSPARQLバリでそれを実行すると、それがOKであると言いますが、私は、ライブラリのSPARQL endpointでそれを実行しようとすると、

Virtuoso 37000 Error SP030: SPARQL compiler, line 6: syntax error at 'GROUP_CONCAT' before '(' 
+0

「ここでは生産できない」とはどういう意味ですか? GROUP_CONCATは機能しませんか? – AKSW

+0

クエリで 'books'という変数を使用していないと、' group by?books'というのは奇妙なようです... –

+0

申し訳ありません、«group by?book»の代わりに«group by books»を書いています。しかしそれは間違いではありません。group_concatで上のコードがエラーになります。 – Nikita

答えて

0

コメントで述べたように、問題はtarget endpointVirtuoso, Open Source Edition, v06.01.3127 as of 2011-11-16上で実行されていることである)、SPARQL 1.1はまだ確定されていなかったとして、SPARQLでGROUP_CONCATをサポートしていませんでした:それは私にエラーを与えます。

current versionにアップグレードすることを強くおすすめします。

このバージョンのVirtuosoには、sql:group_concat, as documentedとして提供されている組み込み関数があります。これは現在あなたに役立つかもしれません。