2014-12-02 2 views
0

개념의 모든 관계에서 관계를 쉽게 얻을 수있는 방법을 찾고 있습니다. 예 : 이름이 "Abc"인 개념을 검색합니다. 그것은 "D", "Ef", "Ghi"와 같은 다른 대상과 관계가 있습니다. 결과는 다음과 같습니다.UNION sparql 부속 쿼리

------------------------------------------------------------------------------- 
| concept | relation  | value | 
===================================== 
| uri:Abc | skos:narrower | uri:D | 
| uri:Abc | skos:narrower | uri:Ef | 
| uri:Abc | skos:broader | uri:Ghi | 
-------------------------------------

이제 "Abc"의 관계를 알 수 있습니다. "Abc"의 관계에서 관계를 알고 싶다면 subselect를 사용할 수 있습니다. 아래 쿼리와 같은. 하지만 내가 원하는 것은 두 가지 결과 다. 나는 "Abc"와 "D", "Ef", "Ghi"의 관계를 알게 될 것이다.

SELECT (?v1 as ?concept) ?relation ?value WHERE 
{ 
    ?v1 ?relation ?value . 
    { 
     SELECT ?c1 ?r1 ?v1 WHERE 
     { 
      ?c1 rdf:label "Abc" . 
      ?c1 ?r1 ?v1 . 
     } 
    } 
} 

이것은 현재 검색어입니다. 프로덕션에서는 필터를 사용하지만이 예제에서는 필요하지 않습니다.

+0

여기에 몇 개의 열을 넣으시겠습니까? "2 차 수준"관계를 추가 열로 사용 하시겠습니까? –

+0

3 개의 열이 필요합니다. 왜냐하면 나는 깊이를 사용하고 싶다. 관계의 관계 등을 얻을 수 있어야합니다. –

답변

1

여기에 하위 쿼리가 필요하지 않으며 처음 시도가 실제로 필요한 것보다 훨씬 복잡했습니다.

select ?s ?p ?o { 
    ?c rdfs:label "Abc" . 
    ?c (<>|!<>)? ?s . 
    ?s ?p ?o . 
} 

C RDFS : : 레이블이 "ABC 주제 중 하나를 레이블이"ABC "하거나 연결 무언가를 가진 것입니다 모든 주제, 술어, 객체 트리플을 원하는 경우에, 당신은이 쿼리를 사용할 수 있습니다은 쿼리와 마찬가지로 ?을 Abc 개체에 바인딩합니다. 그런 다음 ? c (<> |! <>)? ??? 또는 그로부터 1 개의 관계가되도록합니다. 이것은 <> |! <>은 와일드 카드입니다 (모든 속성은 <>이거나 그렇지 않으므로 ?은 0 번 또는 1 번 발생 함). 예를 들어

,이 데이터와 쿼리, 다음과 같은 결과를 얻을 : (당신이 근본적으로 다시 트리플을 받고있어 이후)

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. 
@prefix skos: <http://www.w3.org/2004/02/skos/core#>. 
@prefix : <urn:ex:>. 

:Abc rdfs:label "Abc" ; 
    skos:narrower :D, :Ef ; 
    skos:broader :Ghi . 

:D skos:narrower :Da, :De, :Do . 

:Ghi skos:narrower :Ginormous, :General . 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix skos: <http://www.w3.org/2004/02/skos/core#> 
prefix : <urn:ex:> 

select ?s ?p ?o { 
    ?c rdfs:label "Abc" . 
    ?c (<>|!<>)? ?s . 
    ?s ?p ?o 
} 
------------------------------------- 
| s | p    | o   | 
===================================== 
| :Ghi | skos:narrower | :General | 
| :Ghi | skos:narrower | :Ginormous | 
| :D | skos:narrower | :Do  | 
| :D | skos:narrower | :De  | 
| :D | skos:narrower | :Da  | 
| :Abc | skos:broader | :Ghi  | 
| :Abc | skos:narrower | :Ef  | 
| :Abc | skos:narrower | :D   | 
| :Abc | rdfs:label | "Abc"  | 
------------------------------------- 

이의 구조 버전은 다음과 같습니다

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix skos: <http://www.w3.org/2004/02/skos/core#> 
prefix : <urn:ex:> 

construct { ?s ?p ?o } 
where { 
    ?c rdfs:label "Abc" . 
    ?c (<>|!<>)? ?s . 
    ?s ?p ?o 
} 
+1

6 개의 열은 없지만 3, subject, predicate 및 object를 사용하려면 CONSTRUCT 쿼리를 사용해야합니다. 선택. 그렇게하면 RDF 트리플을 얻을 수 있습니다. 훨씬 쉬워집니다. –

+0

3 열을 표시하고 싶습니다. 열 1은 개념, 2는 관계의 종류, 3은 관련 개념입니다. 'CONSTRUCT' 예제가 있습니까? –

+0

@ JonasB 나는 원래의 대답이 지나치게 복잡하다는 것을 깨달았다. 원하는 세 열이있는 간단한 쿼리로 업데이트했습니다. –