2016-07-08 11 views
1

RDFコレクションをSPARQL 1.1プロパティパスでコンストラクトしようとしています。私が見たプロパティパスの例は、rdf:最初のノードを得ることができますが、bノードを含めてチェーン全体を取得できるものはまだ見ていません。クエリの主要部分は、次のようになります。?RDFコレクション内のFILTER重複ヘッドバインドSPARQL 1.1とのコンストラクタ

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX sc: <http://iiif.io/api/presentation/2#> 

CONSTRUCT {?range sc:hasCanvases ?listid . 
?listid rdf:first ?canvas . 
?listid rdf:rest ?mid . 
?mid rdf:rest ?node . 
?node rdf:first ?canvas . 
?node rdf:rest ?last . 
[...]} 

WHERE {values ?range {<http://some.uri>} 
?range sc:hasCanvases ?listid . 
values ?e { rdf:first rdf:rest } 
?listid rdf:rest* ?mid . 
?mid ?e ?node FILTER (?mid != ?node). 
?listid rdf:first ?first . 
?node rdf:first ?canvas . 
?node rdf:rest ?last . 
[...]} 

それはほとんどことを除いて、作品はlistidノードは、プロパティパス内のすべてのrdf:rest ?midのオブジェクトにバインドします。

jsonld.fromRDFメソッドには、このライブラリを使用したリストの再構築に問題があります。私はさまざまなサブクエリ、プロパティパス、フィルタを試してきましたが、これはかなり固執しています。出来ますか?

+0

:?リストをの値を使用していません。あなたがその部分を残してから、あなたが作ろうとしていることは明確ではありません。また、 "ヘッドノード"が意味することは明確ではありません。クエリに '?head'はありません... –

+0

この解決策をありがとう@JoshuaTaylor 問題はクエリのCONSTRUCT部分にありました(わかりやすくするために追加しました)。これに '' range sc:hasCanvases?listid''を変更しました。これは単に '' range sc:hasCanvases?listid''から '' listid rdf:first?canvas''です。 '?mid rdf:first?canvas .' '?mid rdf:rest?last .' と動作します。 プロパティパスの件名は、パス内の一致するすべてのオブジェクトに反復的にバインドされているようです。したがって、CONSTRUCTで参照されるとき、それは1-1,1-2,1-3,1-4,1-5のようなパターンを示します。 –

答えて

2

あなたが求めているものを正確に明確ではないのですが、あなたはを書きたいようにそれが聞こえますデータ内に存在するリストを含むクエリを作成します()。サンプルデータを提供する方がはるかに簡単です。使用しようとしている完全なクエリを表示すると、推測することが非常に少ないため、非常に簡単です。この前提の下で、いくつかのデータから始めましょう。ここでは、値のリストにそれぞれ1を関連するプロパティを持つ2つのものです:、それを構築します:

@prefix : <urn:ex:> 

:a :hasList (1 2 3 4 5) . 
:b :hasList (6 7 8 9 0) . 

はここに関連付けられたリストを取得するクエリです

prefix : <urn:ex:> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

construct { 
    ?mid rdf:first ?value ; 
     rdf:rest ?tail . 
} 
where { 
    :a :hasList ?list . 
    ?list rdf:rest* ?mid . 
    ?mid rdf:first ?value . 
    ?mid rdf:rest ?tail . 
} 

と結果:あなたが行うので、部分も、もう少し簡潔に行うことができる

<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns="urn:ex:"> 
    <rdf:Description> 
    <rdf:rest rdf:parseType="Resource"> 
     <rdf:rest rdf:parseType="Resource"> 
     <rdf:rest rdf:parseType="Resource"> 
      <rdf:rest rdf:parseType="Resource"> 
      <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/> 
      <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
      >5</rdf:first> 
      </rdf:rest> 
      <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
      >4</rdf:first> 
     </rdf:rest> 
     <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
     >3</rdf:first> 
     </rdf:rest> 
     <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
     >2</rdf:first> 
    </rdf:rest> 
    <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer" 
    >1</rdf:first> 
    </rdf:Description> 
</rdf:RDF> 

ありあなたが使用している完全な構文クエリを表示することができればそれが役立つだろう

:a :hasList/rdf:rest* ?mid . 
    ?mid rdf:first ?value . 
    ?mid rdf:rest ?tail . 
+0

私はこの問題にもう一度戻り、リストの最初のrdf:最初のものがクエリによって返されないことを確認しています。 (例えば、?リストもrdf:firstを持つ)これは、シーケンスを再構成するためにjson-ldライブラリがリスト "head"を識別する必要があるため、重要な部分です。コレクションの構築には、?list rdf:first のセマンティクスがあります。 ?list rdf:rest _:b1。 _:b1 rdf:first ...など。 –

+0

@ChristopherJohnson提供されたクエリは、リストの最初の要素を取得します。キーは '?list rdf:rest *?midのプロパティパスです。 ?mid rdf:first?value .'は、?midの値の1つが?listと同じであることを意味するので、?valueの値の1つはリストの最初の要素です。 –

+0

構文構文が(elt * eltの0回以上の出現回数)の値であり、値リストが:hasListの出現に過ぎない場合、?listもまたrdf:restの出現であり、いいえ?私にとって狂っているのは、実際には1つのデータセットで作業していて、現在は機能していないため、これが間違っているとは確信できません。私の現在の回避策は、最初に?list rdf:restノードを取得し、それを静的な構成値として(重複を避けるため)、また?list rdfの変数を追加することです。すべてが機能します。 –

1

あなたはrdf:rest*/rdf:firstのイディオムを探して、リストのすべてのメンバーを取得していると思います。 (私は?listidは、1つまたは複数のRDFコレクション(リスト)が含まれていることを仮定している)次のことを試してみてください。

SELECT ?node 
WHERE { 
    values ?sequence {<http://some.uri>} 
    ?sequence eg:hasThings ?listid . 
    ?listid rdf:rest*/rdf:first ?node . 
} 
関連する問題