2016-08-15 5 views
1

1つのSPARQLクエリを使用して、特定の述語で識別されるサブジェクトに関連付けられたすべての「プロパティ」を取得する必要があります。 CONSTRUCT(必ずCONSTRUCTまたはSELCETのいずれか)が必要なわけではないので、「エクスポートトリプル」という用語の使用を特に避けています。SPARQLを使用してサブノードを持つRDFリソースを取得

一部の「プロパティ」はノード自体(空白ノードなど)であり、「再帰的に」取得する必要があります。述語の集合は知られています(私はそれらの包括的なリストを持っています、それらはすべて同じ接頭辞にあり、接頭辞を持つものすべてです)。 「再帰」する述語は、それらのサブセットです。

上記の例で
@prefix ex: <http://example.org/ex/> . 
@prefix : <http://example.org/> . 
ex:toExport 
    a ex:SomeClass ;   # to retrieve, as in rdf: namespace 
    :pred-1 "Some value" ;  # to retrieve "as is" 
    :pred-2 42 ;    # to retrieve "as is" 
    :pred-3 [     # blank-node to be retrieved as a whole 
     :pred-1 "..." ; 
     :pred-2 1024 
    ] ; 
    :pred-4 [ 
     :pred-3 [    # "sub" blank-node to be retrieved as a whole 
      :pred-1 "..." ; 
      :pred-2 1024 
     ] 
    ] ; 
    :pred-5 [     # same for a "sub-list" 
     :pred-6 (ex:something ex:else) 
    ] ; 
    :pred-7 ex:subOne .   # "sub-property" can be a non-blank node... 

ex:subOne      # ...defined as a resource of its own 
    :pred-1 "Value" ; 
    :pred-2 0 . 

、Iは述語:pred-1:pred-2(単純な値)、:pred-3(これらの例では2つのトリプルブランクノードとなっている値)とのトリプルを取得する必要があり、:pred-4(A空白ノード自体、余分な空白ノードなど)などがあります。:pred-7は、すべての「サブノード」が必ずしも空白ノードではないことを示すので興味深いです。

次のクエリは、私は私の要件に一致する最も近いですが、それは私が大規模なデータセットに対するクエリのために避けたい虹彩の文字列値、上の正規表現を使用しています。

CONSTRUCT { 
    ?s ?p ?o . 
    ?o ?pp ?oo . 
    ?oo ?ppp ?ooo . 
} 
WHERE { 
{ 
    ?s ?p ?o . 
    FILTER (regex(str(?p), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)")) 
    OPTIONAL 
    { 
     ?o ?pp ?oo . 
     FILTER (regex(str(?pp), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)")) 
     OPTIONAL 
     { 
      ?oo ?ppp ?ooo . 
      FILTER (regex(str(?ppp), "^(http://www.w3.org/ns/shacl#|http://www.w3.org/1999/02/22-rdf-syntax-ns#)")) 
     } 
    } 
} 

述語の集合は20種類の述語のようなものなので、何らかの形でリストするのは容易ですが、それがコンビナトリアルな方法であればそうではありません。正規表現のための具体的

+0

私はそれを最適化する可能性はあまりありませんが、少なくとも1回だけ実行されるように、別個のサブSELECTクエリの中で少なくとも異なるプロパティをクエリできます。残りのクエリは期待通りであり、深さ3のサブグラフの生成 – AKSW

答えて

0

:あなたの目標は、単にそれが簡単にあなたがこれらの線に沿って何かを行うことができ読み取るために作るのであれば:

FILTER(STRSTARTS(STR(?p), STR(rdf:)) || STRSTARTS(STR(?p), STR(shacl:))) 

これは、あなたが完全な名前空間アイリス長い正規表現を使用する必要がなくなります、また、論理和を正規表現からSPARQLフィルタロジック自体に移します(おそらくより効率的です)。

これ以外にも、私はただちに単一のSPARQLクエリでこれを改善する簡単な方法を見ていません。しかし、結果を妥協して後処理をしたい場合は、はるかに単純なクエリを使用して、かなり近づけることができます。

  1. :pred-7年代:これはより困難にあなたのシナリオに2つの要件があります、しかし

    DESCRIBE ex:toExport 
    

    通常は、この種のものは非常によく、簡単なDESCRIBEクエリを使用して提供しています値は返される必要があります。DESCRIBEは、通常、記述されているリソースの空のノードクロージャだけを返します。これは完全な答えではありません。

  2. 特定のプロパティのみが返されます。DESCRIBEは、通常すべてプロパティを返します。

最初の問題については、DESCRIBEクエリを予測結果に近づけるように拡張することができます。

DESCRIBE ex:toExport ?x 
WHERE { 
     ex:toExport ?p ?x . 
     FILTER(isIRI(?x)) 
     FILTER(STRSTARTS(STR(?p), STR(rdf:)) || STRSTARTS(STR(?p), STR(shacl:))) 
} 

この結果は、あなたが望むすべてのデータを取得しますが、それはまだdoesnの:たとえば、私たちはex:toExportを記述するだけでなく、希望の特性のうちの1つを介してex:toExportに接続IRIをしているすべてのリソース?xはそれを修正することができ問題2を解決しません:返されたプロパティは期待通りのものに限定されませんが、すべてのプロパティex:toExport?xが返されます。

これらの不要なプロパティをフィルタリングすることは、もちろん後処理で行うことができますが、シナリオに適しているかどうかは、最初にデータに含まれる「不要な」プロパティの量によって決まります。

最後の注意点:DESCRIBEクエリの正確な結果は実装依存です。 ほとんどのの実装では、何らかの形の空白ノードクロージャが返されますが、バリエーションがあります。 SPARQLエンジンのドキュメントをチェックしてください(またはテストスピンを実行して、その動作を確認してください)。

関連する問題