2

私は次のSPARQLクエリを使用しています。これは、私の機関のSPARQLエンドポイントのWebベースのエンドの例です。

SELECT ?building_number ?name ?occupants WHERE {
  ?site a org:Site ;
        rdfs:label "Highfield Campus" .

  ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

問題は、私が興味を持っているデータセットである「建物と場所」からデータを取得するだけでなく、この例で使用することを期待しているだけでなく、「施設と設備」データセットからもデータを取得することです。これは関連性がありません。 。リンクをたどると、これが表示されます。

この例は、施設と設備のデータセットの追加よりも前のものである可能性がありますが、SPARQLについて行った調査を行っても、含めるデータセットを定義する明確な方法がわかりません。

「建物」、より具体的には「建物と場所」データセットの結果のみを表示するように制限する開始点を誰かが推奨できますか。

ありがとう

4

1 に答える 1

4

まず最初に、実際にはSELECT DISTINCTを使用する必要があります。そうしないと、結果が繰り返されます。

質問に答えるには、GRAPH {...}を使用して、SPARQLクエリの特定の部分をフィルタリングし、特定のデータセットのデータのみに一致させることができます。これは、SPARQLエンドポイントがGRAPHに分割されている場合にのみ機能します(これは)。「場所」データセット内のサイト内のものは常に建物に制限されると想定しているため、あなたが求めた解決策は最善の選択ではありません...それは危険です-いつか木や道標が含まれる可能性があるためです将来。

ステップ1は、どのグラフが機能しているかを調べることです。

SELECT DISTINCT ?g1 ?building_number ?name ?occupants WHERE {
  ?site a org:Site ;
        rdfs:label "Highfield Campus" .

  GRAPH ?g1 { ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .
            }

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

ここで試してみてください:http://is.gd/WdRAGX

これから、http ://id.southampton.ac.uk/dataset/places/latestとhttp://id.southampton.ac.uk/dataset/places/facilitiesが2つの関連するものであることがわかります。

「場所」グラフに従ってサイト内の「場所」のみを検索するには、次を使用します。SELECT DISTINCT?building_number?name?occupants WHERE {?site a org:Site; rdfs:label"ハイフィールドキャンパス"。

  GRAPH <http://id.southampton.ac.uk/dataset/places/latest> { 
        ?building spacerel:within ?site ;
            skos:notation ?building_number ;
            rdfs:label ?name .
            }

  OPTIONAL {
    ?building soton:buildingOccupants ?occ .
    ?occ rdfs:label ?occupants .
  } .
} ORDER BY ?name

代替ソリューション:


rdf:typeを使用する

上記であなたの質問に答えましたが、それはあなたの問題に対する答えではありません。このソリューションは、実際には「キャンパス内の建物のみを提供する」と言っているため、より意味論的です。これは、あなたが本当に意味していることです。

あまり「セマンティック」ではないグラフでフィルタリングする代わりに、「建物」を研究施設ではない「建物」クラスに制限することもできます。それらはまだ時々「サイト内」としてリストされています。通常、大学がどのキャンパスにあるかだけを公開し、どの建物を公開していない場合。

?building a rooms:Building 

FILTERの使用

極端な場合、異なるGRAPHSのデータがなく、結果をフィルタリングするために使用するエレガントな関係がない場合があります。この場合、FILTERを使用して、建物のURIを文字列に変換し、正規表現を使用して受け入れ可能な式と一致させることができます。

FILTER regex(str(?building), "^http://id.southampton.ac.uk/building/")  

これは最悪のオプションであり、必要な場合は使用しないでください。


ベルトとブレース

これらの制限のいずれかを一緒に使用でき、GRAPHを制限することと、すべての建物が実際に建物であることを確認することの組み合わせが、私の推奨される解決策になります。

于 2013-03-10T13:16:27.540 に答える