8

結果を返すために Sparql クエリを使用して、Mulgara RDF ストアから RDF グラフを作成しようとしています。私は単純なクエリに慣れ始めたばかりで、「特定のコレクションのメンバーはどのオブジェクトですか?」と効果的に尋ねています。

私の質問は、この単純なクエリから結果を取得し、それらをクエリのオブジェクトとして再ルーティングできるかどうか、アドバイスをいただければ幸いです。

たとえば、次の sparql クエリがあります。

SELECT ?x WHERE {?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>}

これらの結果:

"x"
info:fedora/ramsey:ThelifeandadventuresofRobinsonCrusoe 
info:fedora/ramsey:Jackanapes 
info:fedora/ramsey:SundayJournalvol01no0219951126 
info:fedora/ramsey:Ideologyandchange 
info:fedora/ramsey:theshepherdofthepyrenees 
info:fedora/ramsey:ScenesinAmerica
...

私の目標は、これらの一意の識別子を取得し、元のクエリからオブジェクト を置き換えて<info:fedora/collection:ramsey>、クエリを再度実行することです。

最初のクエリでルート要素を識別し、結果ですべてのメンバー オブジェクトを返し、それらすべてのオブジェクトのメンバー オブジェクトを無限に返すシナリオを想像しています...

これは Sparql クエリで可能ですか? 具体的には、Mulgara RDF データベースにクエリを実行していると思います。実行できない場合でも、どんな考えでも大歓迎です。

4

1 に答える 1

16

SPARQL 1.0 に固執する必要があると仮定しましょう。私は、mulgara が SPARQL 1.1 のサポートを制限していると信じています。

SPARQL 1.0 では、クエリを実行するレベル数がおそらくわかっている場合は、次のようなことができます。

SELECT ?y WHERE {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?y  <fedora-rels-ext:isMemberOfCollection> ?x
}

ここで?yは、ルートからの第 2 レベルの要素にバインドされます。UNIONS を使用すると、1 つのクエリで複数のレベルをクエリできます。1 つのクエリでルートから 1 レベルと 2 レベルの例:

SELECT ?x WHERE {
     {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> .
     } UNION {
        ?zz  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?x  <fedora-rels-ext:isMemberOfCollection> ?zz .
     }
}

?xこれに関する問題は、どのレベルでバインドされているかが実際にはわからないことです。したがって、このタイプのクエリでツリーをペイントすることはできません。SPARQL 1.1 では、これはBIND ASで解決されます

SELECT ?x ?level WHERE {
     {
        ?x  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> .
        BIND (1 AS ?level)
     } UNION {
        ?zz  <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>
        ?x  <fedora-rels-ext:isMemberOfCollection> ?zz .
        BIND (2 AS ?level)
     }
}

?xこの 2 番目のクエリは、バインドされているレベルを返します。ツリーの最大深度に到達しようとする多数のユニオンを使用して、プログラムで生成されたクエリを想像できます。SPARQL 1.1 の完全なサポートが必要な場合は、Jena/ARQを使用してみてください。Jena では、次のようなプロパティ パスを使用することもできます。

SELECT ?x WHERE {
    ?x  <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> .
}

predicate 経由で?x到達可能なすべてのノードをバインドします。<info:fedora/collection:ramsey><fedora-rels-ext:isMemberOfCollection>

于 2013-02-26T02:22:37.110 に答える