4

Virtuosoにいくつかの名前付きグラフが保存されていますが、提供されたリストから最も多くの用語に一致するグラフを見つけたいと思います。

私のクエリはプログラムで作成され、次のようになります。

SELECT DISTINCT ?graph (count(DISTINCT ?match) as ?matches)
WHERE {
  GRAPH ?graph {
    {?match rdf:label "term 1"} 
     UNION {?match rdf:label "term 2"} 
     UNION {?match rdf:label "term 3"}
     ...
  }
}
ORDER BY DESC(?matches)

各用語は別のUNION句になります。

これを行うためのより良い方法はありますか?クエリは長くて醜く速くなり、用語が多すぎるとVirtuosoは文句を言います。

4

3 に答える 3

3

(それは rdfs:label です)

それを書く別の方法は次のとおりです。

{ ?match rdfs:label ?X . FILTER (?x in ("term 1", "term 2", "term 3")) }

または (SPARQL 1.0)

{ ?match rdfs:label ?X . FILTER ( ?x = "term 1" || ?x = "term 2" || ?x = "term 3" )  }
于 2013-02-23T11:52:43.900 に答える
1

値のソリューションは、次のように UNDEF を使用できるため、さらに強力です (例):

VALUES (?s ?p ?o) { (<http://abc#X> <http://abc#P1> UNDEF)
                    (UNDEF <http://abc#P2> <http://abc#Y>) }

UNDEF にはワイルドカード機能があり、返されるトリプレットのセットは、各値のトリプレットを個別に一致させたものです。もちろん、大規模なデータセットの場合、パフォーマンスの観点からは遅くなる可能性があります

于 2016-11-20T07:24:27.017 に答える