3

巨大な RDF グラフがあり、次のことをしたいとします。

select ?n ?o 
where {
    ?n <name_of_a_node> <name_of_this_node>.
    ?n ?p ?o.
    ?o <type_of_a_node> ?t.
    FILTER(REGEX(STR(?t), "president")).
}

上記のクエリは、ノード n の名前を知っていることを示しています。したがって、ノード n の URI を取得しています。次に、ノード n のすべての述語と、この述語を介して接続されている他のノードを取得しています。ノード a に接続されているこれらのノード o ごとに、それらのプロパティ (タイプ プロパティ) を調べて、タイプ プロパティに部分文字列を持つノード o のみを取得します。

これは SPARQL で可能ですか? 基本的には、ノードに立って、このノードが接続されている他のすべてのノードを調べ、プロパティの別の条件に一致するノードのみを取得します。

それ以外の場合、ノード n が接続されているすべてのノードを取得し、それぞれに対して別の SPARQL クエリを実行してこのチェックを行う必要がありますか?

JENAを使用してデータを保存しています。

4

1 に答える 1

5

はい、これは可能ですが、ほとんどの場合、このようなクエリを書くことはお勧めできません。

使用するものはすべてFILTER、考えられるすべてのソリューションを調べ、その中の式を評価するために SPARQL エンジンを必要としますが、多くの式は迅速かつ安価に評価でき、一部の式REGEXは非常に高価です。

基本的に、SPARQL エンジンに可能な結果の大規模で無制限の範囲を取得し、すべての可能なソリューションに対して正規表現を適用するように要求しています。Java 正規表現のパフォーマンスについて何か知っている場合は、SPARQL での使用に関係なく、これは非常に悪い考えであることが多いことがわかります。

多くの SPARQL エンジンは、SPARQL エンジンがより効率的に処理できるように、これらの種類のクエリを表現できる全文拡張機能をサポートしています。Apache Jena については、LARQを参照してください。

于 2013-01-31T11:01:31.473 に答える