2013-03-09 3 views
2

다음 웹 사이트의 예제 인 SPARQL 쿼리를 사용하고 있습니다. my institution's SPARQL endpoint;SPARQL 쿼리를 하나의 데이터 세트로 제한

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

중요한 것부터 먼저, 당신은 정말, DISTINCT 사용을 선택해야합니다.

질문에 대답하기 위해 GRAPH {...}를 사용하여 SPARQL 쿼리의 특정 부분을 필터링하여 특정 데이터 집합의 데이터 만 일치시킬 수 있습니다. 이는 SPARQL 엔드 포인트가 GRAPH로 분할 된 경우에만 작동합니다 (이 중 하나는 GRAPH입니다). 귀하가 요청한 해결책은 최선의 선택이 아닙니다. '장소'데이터 세트의 사이트 내의 것들이 항상 건물에 숨겨져 있다고 가정하기 때문에 ... 위험합니다. 얼마 지나지 않아 나무와 푯말이 포함될 수 있으므로 미래에.

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/latesthttp://id.southampton.ac.uk/dataset/places/facilities 두 관련된 것들입니다 것을 볼 수 있습니다

1 단계는 그래프 플레이 무엇인지 찾는 것입니다.

"장소"그래프에 따라 사이트 내에서 '물건'만 찾으려면 다음을 사용하십시오. SELECT DISTINCT? building_number? name? occupants 어디서? { ? site a org : Site; rdfs : label "Highfield Campus".

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 사용 : 유형 I 위

귀하의 질문에 대답했지만,이 문제에 대한 답이 아니다. 이 솔루션은 실제로 의미하는 바대로 실제로는 '캠퍼스 내 건물 만'이라고 말하면서 더 의미가 있습니다.

매우 의미 론적이지 않은 그래프로 필터링하는 대신 리서치 시설이 아닌 'building'클래스로 제한 할 수 있습니다. 그들은 때때로 '사이트'내에있는 것으로 때때로 열거됩니다. 일반적으로 유니가 어떤 캠퍼스를 게시했는지 만 게시했는데 어느 건물이 아닌지 게시했습니다.서로 다른 그래프에서 데이터가 없을 수 있습니다 및 결과를 필터링하는 데 사용할 우아한 관계가되지 않을 수 있습니다 극단적 인 경우에는 필터

를 사용

?building a rooms:Building 

.

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

이 훨씬 최악의 옵션을 바 당신이있는 경우에 그것을 사용하지 않는 것입니다 : 허용 것들에 맞게이 경우 필터를 사용할 수 있으며, 문자열로 건물 URI를 설정하고 정규 표현식을 사용 .


는 벨트와 중괄호

당신은 함께 이러한 restictions 그래프를 제한 플러스 모든 것을 보장의 조합 중 하나를 사용할 수 있습니까? 건물은 정말 건물 내 권장 솔루션이 될 것입니다.

+0

당신의 예제에서 접두어'rooms :'은 정의되지 않았지만'PREFIX rooms : '그것은 절대적으로 완벽하게 작동했습니다! 고마워요! –

관련 문제