스파클 사용하기 SPARQL Tutorial - Alternatives in a Pattern

     




SPARQL Tutorial - Alternatives in a Pattern


이번 챕터에서는 "UNION"이라는 쿼리문을 사용하는 법을 알려준다.


UNION - two ways to the same data


이번에 예제로 사용하게 될 모델은 RDF형식이 아니다. 확장자가 ttl인 것으로 보아 이전에 언급했던 터틀형식의 문서입니다.


@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> .

_:a foaf:name   "Matt Jones" .

_:b foaf:name   "Sarah Jones" .

_:c vcard:FN    "Becky Smith" .

_:d vcard:FN    "John Smith" .


이번 모델에서는 이름을 표기할 때 foaf와 vcard라는 두 가지의 NS를 사용하였습니다. 하지만 결론적으로 나타내는 것은 이름이다. 위와 같은 모델에서처럼 같은 내용을 다른 NS로 표현한 값을 동시에 출력하고자 할 때, UNION을 사용합니다.


PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name
WHERE
{
   { [] foaf:name ?name } UNION { [] vCard:FN ?name }
}


위에 쿼리문에서 ?name을 출력하고 조건절에서는 [] (아마 공백을 표시한 듯?) foaf:name ?name 이라는 트리플과 []vCard:FN ?name 이라는 트리플을 UNION으로 묶었습니다. 아마 and연산자와 같은 역할을 하는 것 같습니다. 결과는 다음과 같이 출력됩니다.


-----------------
| name          |
=================
| "Matt Jones"  |
| "Sarah Jones" |
| "Becky Smith" |
| "John Smith"  |
-----------------


메뉴얼만 보고는 뭔가 체감이 안되니까 직접 해보겠습니다. 


q-union1.rq


vc-db-3.ttl


쿼리파일과 터틀파일을 받으신 다음 명령 프롬프트창을 켭니다. JENAROOT을 설정해 주시고 다음과 같은 명령문을 실행합니다.




위처럼 메뉴얼과 같은 결과값이 출력되는 것을 볼 수 있습니다.


PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name
WHERE
{
  [] ?p ?name
  FILTER ( ?p = foaf:name || ?p = vCard:FN )
}


UNION을 쓰지 않고도 FILTER만 사용해서 같은 기능을 구현할 수 있습니다. 하지만 많은 데이터가 있는 모델에 쿼리를 날릴 경우, UNION명령어가 더 빠르게 처리합니다. FILTER의 경우 모든 트리플을 탐색해서 처리하기 때문에 UNION보다 오래 걸립니다. 물론 예제처럼 간단한 모델에서는 별로 차이가 없습니다.



Union - remembering where the data was found



PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name1 ?name2
WHERE
{
   { [] foaf:name ?name1 } UNION { [] vCard:FN ?name2 }
}

---------------------------------
| name1         | name2         |
=================================
| "Matt Jones"  |               |
| "Sarah Jones" |               |
|               | "Becky Smith" |
|               | "John Smith"  |
---------------------------------


같이 출력하지만, 그 안에서 구분할 수 있습니다. 위처럼 쿼리문을 작성하면 바로 아래와 같은 결과값이 출력됩니다. 만약 UNION을 사용하지 않았다면 name1과 name2가 같은 행에 출력되었겠죠?


OPTIONAL and UNION


마지막으로 OPTIONAL과 UNION을 비교합니다. 


PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name1 ?name2
WHERE
{
  ?x a foaf:Person
  OPTIONAL { ?x  foaf:name  ?name1 }
  OPTIONAL { ?x  vCard:FN   ?name2 }
}

---------------------------------
| name1         | name2         |
=================================
| "Matt Jones"  |               |
| "Sarah Jones" |               |
|               | "Becky Smith" |
|               | "John Smith"  |
---------------------------------


결과적으로는 바로 전 쿼리문과 결과값이 같지만, OPTIONAL기능만 사용하였습니다. 뭐 이렇게도 표현할 수 있다정도만 알면 될 것 같습니다.





다음 포스팅은 Datasets 입니다.

반응형

댓글

Designed by JB FACTORY