9

比較的基本的なタスクに SPARQL を使用しようとしています。FOAF グラフが与えられた場合、そこにある要素を解析し、タグが存在する場合はそれらを取得してから、それらを新しいグラフとして使用して、それらの人々に関する情報を見つけます。

たとえば、SPARQL クエリを実行して、すべての私のお気に入りの食べ物 (私の FOAF ファイルに従って) と、すべての友人の好きな食べ物をリストする単純な使用例を想像できます。

これが現時点での外観です。テスト目的で、現時点で以下のクエリで行おうとしているのは、?name3 変数を使用して友人の名前を取得することだけです。rdfs:seeAlso がいくつかの有効な RDF ファイルにリンクしていることを知っていても、このクエリを実行しても ?graph と ?name3 の結果は返されません。少なくとも 2 つのファイルには name 属性が必要です。ご意見をお寄せいただきありがとうございます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?graph ?name3
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .
        GRAPH ?graph {
            ?person3 foaf:name ?name3 .         
        }   
    }       
}
4

2 に答える 2

7

GRAPH は暗黙的にリモート データをストアにフェッチしないため、セキュリティ リスクが大きくなります。これを有効にできるシステムもあるかもしれませんが、標準ではありません。

ただし、SPARQL 1.1 Update では、これを行うキーワード LOAD がありますが、次のように記述できます。

LOAD <uri>

グラフをストアにフェッチするため、次のように記述できます。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?graph
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .   
    }       
}

?graph のバインディングを一連の LOAD ステートメントにフィードしてから、元のクエリを実行します。

注: 一部のシステムでは、たとえば 4store で LOAD を有効にする必要があります。デフォルトでは許可されていないため、使用しているストアのドキュメントを確認してください。

于 2011-02-11T14:15:01.057 に答える
4

LOADを使用する代わりに、上記のSteveの例のように、含める必要のあるグラフを見つけたら、代わりにFROM NAMEDを使用して、結果のクエリに関連するすべてのグラフを記載するのは合理的ではありません。

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?name3
FROM <my-rdf-file>
FROM NAMED <discovered-graph-URI-1>
FROM NAMED <discovered-graph-URI-n>
WHERE { 
GRAPH <my-rdf-file> {
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
 }
    OPTIONAL { 
        ?person2 rdfs:seeAlso <discovered-graph-URI-1> .
        GRAPH <discovered-graph-URI-1> {
            ?person3 foaf:name ?name3 .         
        }   
        ?person2 rdfs:seeAlso <discovered-graph-URI-n> .
        GRAPH <discovered-graph-URI-n> {
            ?person3 foaf:name ?name3 .         
        }  
    }       
}

そうすれば、セキュリティの問題を回避でき、独自のトリプルストアにデータを保持する必要がなくなります。

于 2011-02-16T19:11:08.153 に答える