스파클 사용하기 SPARQL Tutorial - Alternatives in a Pattern
- Study/OWL,RDF
- 2014. 2. 19. 17:16
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" | -----------------
메뉴얼만 보고는 뭔가 체감이 안되니까 직접 해보겠습니다.
쿼리파일과 터틀파일을 받으신 다음 명령 프롬프트창을 켭니다. 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 입니다.
'Study > OWL,RDF' 카테고리의 다른 글
자바에서 스파클 사용하기 ARQ - Application API (3) | 2014.02.19 |
---|---|
스파클 사용하기 SPARQL Tutorial - Datasets (0) | 2014.02.19 |
스파클 사용하기 SPARQL Tutorial - Optional Information (0) | 2014.02.18 |
스파클 사용하기 SPARQL Tutorial - Filters (2) | 2014.02.18 |
스파클 사용하기 SPARQL Tutorial - Basic Patterns (0) | 2014.02.18 |