私はSPARQLの初心者であり、推移的な関係を返すのに役立つクエリがあるかどうか疑問に思っていました。たとえば、以下のn3ファイルでは、「aはcと同じです」などを返すクエリが必要です。ありがとう
@prefix : <http://websitename.com/links/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
:a owl:sameas :b.
:b owl:sameas :c.
適切に有効化されたSPARQL1.1エンジンを使用している場合は、プロパティパスを使用できます。質問にイエナのタグを付けているので、この機能をサポートするARQエンジンを使用していると思います。
したがって、次のようなクエリを記述できます。
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
?x owl:sameAs+ ?y
}
+
1つ以上のステップで構成される関係を検索する必要があることを示すために使用される述語の後に注意してください。
プロパティパスの構文はここにあり、のような非常に正規表現です。これを使用するクエリの唯一の欠点は、パスの長さや中間ノードの長さに関する情報が得られないことです。
あなたの場合、 RobVの答えは正しいですが、 owl:sameAs の双方向性は言及する価値があると思います。
これであなたの例を拡張しましょう:
:a owl:sameAs :d.
:e owl:sameAs :d.
その場合、単純なowl:sameAs+
find では不十分なので、等価ツリー全体を見つける:e
ようなものを使用するかもしれません。(owl:sameAs|^owl:sameAs)+
エンドポイントによっては、ループが発生する可能性があることに注意してください。
また、 Virtuosoowl:sameAs
のように、推論を処理するための実装固有の拡張機能がある場合があります。
DEFINE input:same-as "yes"
select * where { :a ?p ?o. }
?p
および?o
に対して発行された:b, :c, :d
およびも返し:e
ます。