2017-05-04 7 views
0

私は次のようなRDFトリプルのコレクションを持っています。SPARQLでの星サブグラフパターンの発見

id#7289587 ex:getInfectedBy id#7748320 
id#7694711 ex:getInfectedBy id#7748320 
id#7748322 ex:getInfectedBy id#7748320 
id#7748887 ex:getInfectedBy id#7748320 

id#7746679 ex:getInfectedBy id#7748510 
id#6434108 ex:getInfectedBy id#7748510 
id#7458397 ex:getInfectedBy id#7748510 

私の目標は、さまざまなノードの長さ(4,5,6、...、20)の星の部分グラフパターンを数えることです。たとえば、次のクエリを書いて、ノード長4の星形部分グラフパターン(?s1?s2?s3?o)を見つけました。両方のノードid#7748320id#7748510ため

SELECT ?o count(distinct ?o) 
WHERE 
{ 
    ?s1 ?p ?o. 
    ?s2 ?p ?o. 
    ?s3 ?p ?o.FILTER((?s1!=?s2) && (?s1!=?s3) && (?s2!=?s3)) 
} group by ?o 

ノード4の上記クエリーカウントスターパターン長。しかし、ノードid#7748510だけの結果を私に与えると仮定します。 5ノードスターパターンでクエリを変更すると、ノードid#7748320も同様に表示されます。それを修正するために私を助けてもらえますか?

さまざまなノード長(4,5,6、...、20)のスターサブグラフパターンを1つのクエリでカウントすることはできますか?私にお知らせください。私はあなたの助けに感謝します。私のコメントに加えて

+0

単に* WHERE 'SELECT'使用しますSPARQLでなぜこれが正しいのかを確認するためにクエリを実行してください。ノード 'id#7748320'のデータもSPARQLクエリのパターンと一致していることは明らかです。クエリの要件を"少なくとも満たす "ことを求めているだけです。 – AKSW

答えて

1

、私は単純に「ノードごとのすべての受信ノードをカウントし、」別の、より効率的なクエリを使用して、HAVINGを使用して、それをフィルタリングします:

SELECT ?o (COUNT(DISTINCT ?s) AS ?cnt) 
WHERE 
    { ?s ?p ?node } 
GROUP BY ?o 
HAVING (?cnt = 3) # three incoming nodes 
+0

ご返信ありがとうございました。私は ''ノード ''ではなく '' o''を意味すると思います。私はあなたが巨匠のSPARQLエンドポイントで提供したクエリを実行しました。 'Virtuoso 37000エラーSP031:SPARQLコンパイラ:変数?cntは集計外の結果セットで使用され、GROUP BY句には言及されていません。親切に私に返信してください。 –

+1

次のように 'HAVING'節を修正すると動作します:' HAVING(COUNT(DISTINCT?s)= 3) '。ご助力ありがとうございます。 –

+0

私はVirtuosoに問題があることを忘れていましたが、集計の結果が依然として有効範囲にあるが、エラーはとにかく報告される場合があります。 – AKSW