2017-04-04 15 views
0

SPARQLの推移的クエリの結果が、歩かれた順番に戻ることを保証できますか?推移的SPARQLクエリでの順序付け

<http://example.com/step0> ex:contains <http://example.com/step1> 
<http://example.com/step1> ex:contains <http://example.com/step2> 
<http://example.com/step2> ex:contains <http://example.com/step3> 

(実際には関係がより多くの回繰り返すことができ)

クエリ(SPARQL 1.1を使用して)::

SELECT ?parent 
WHERE { 
    ?parent ex:contains* <http://example.com/step3> 
} 

そのようなあなたはそのいくつかの簡単なデータ与えそう

、常に[step0、step1、step2]に戻ります。 jenaでこれを試してみると、一貫性があり、ランダムに順序付けられた結果が得られます。また

、私は外にそれを並べ替えることができるように、私は推移散歩に戻って親と子の両方を得ることができれば、それは大丈夫だと思うが、私は両方?parent ex:contains* <http://example.com/step3>をバインドする方法を知っていると戻って得ることはありませんフィルターを使用して非常に遅いネストされたクエリーを記述することなく、中間関係のオブジェクトを作成します。あなたのデータの例を考えると

+0

ある1つの結果だけを返すんあなたのクエリ 'のhttp://example.com/step2'、したがって、私はあなたがJenaで動作すると言う理由は分かりませんが、結果はランダムに並べられます。 'ex:contains *'のようなプロパティパスが使われていないので、あなたは既にここで推移性のコンセプトを解決しているのを見ることはできません – AKSW

+0

私はその質問に最も重要な一文字を残しました。それはex:contains *、質問を更新しました – Ben

答えて

2

、あなたが順序尺度としてホップ数を使用できます。

PREFIX ex: <http://example.com/> 

SELECT ?start 
WHERE 
    { ?start (ex:contains)+ ?mid . 
    ?mid (ex:contains)* ex:step3 
    } 
GROUP BY ?start 
ORDER BY DESC(COUNT(?mid)) 

出力:

------------ 
| start | 
============ 
| ex:step0 | 
| ex:step1 | 
| ex:step2 | 
------------ 
+0

いくつかのテストの後、これが動作しているように見えます、ありがとう!唯一の問題は、グラフのサイズ(線形に見える)によってパフォーマンスがかなり低下することです。しかし、WHERE句の条件を "{?mid(ex:contains)* ex:step3。?start(ex:contains)+?mid}"に変更しても、順序は正しくありますが、ポピュレートされたグラフをもう一度ドロップしてください。それは元のクエリより約2〜3倍遅くなりますが、複数のクエリを実行する必要はありません。 – Ben

0

は、試してみてください。

SELECT ?parent ?child ?subchid 
WHERE { 
    ?parent ex:contains <http://example.com/step3> . 
    ?child ex:contains ?parent . 
    OPTIONAL { ?subchild ex:contains ?child . } 
} 

ではなく、すべてのex:containsの関係は、以下の3つのレベルに行く場合は、あなたがOPTIONALパターンマッチを行う必要があります。

+0

あなたの答えをありがとう、私は間違って*を 'ex:contains *'に置き換えました。これはクエリを推移的にします。私は質問を更新しました。私の場合の過渡的な関係の深さは、無限の深さになります。 OPTIONALがどのように使われているかを見てみる必要がありますが、私は他の回答でそれを見ていましたが、Virtuoso固有のシンタックスであるという印象を受けました。 – Ben

+0

OPのアップデートについては、@ASKWの回答を参照してください。 'OPTIONAL'を使う例として、上記のレスポンスを編集しました。 – scotthenninger

1

SPARQLの推移的クエリの結果が、歩かれた順に戻ってくることを保証できますか?

ません(SPARQL 1.1標準順序を定義していません)。ここ

、固定オブジェクトと、実際のデータが直線経路自然散歩順序があることを意味して起こるです。

Apache Jena SPARQLの実行は確定的(この場合)であるため、結果の内部収集が順序を保持するため、何らかの順序で出てきます。すべてのJenaのバージョンがこれを行うわけではありません。

他の非線形パスについては、何も確かではありません。データはハッシュマップを使用して格納されます。単純な線形の経路については

+0

ありがとう、推移的なクエリに順序付けメカニズムがあると明示的に言及したものを見つけるのが難しかったので、これが確認されたことを確認するとよいでしょう。 – Ben

関連する問題