まず最初に、実際には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を制限することと、すべての建物が実際に建物であることを確認することの組み合わせが、私の推奨される解決策になります。