SPARQL 활용


h4_circle.png SPARQL 의 질의형식

  • SPARQL 질의 형식은 개략적으로 아래와 같다.
  • 질의에서 사용되는 변수는 "? 변수명" 또는 "$변수명" 과 같은 형태로 사용한다.

PREFIX
SELECT / CONSTRUCT / ASK / DESCRIBE
     (DISTINCT / REDUCED)
FROM(NAMED)
WHERE
       Graph Pattern / OPTIONAL / FILTER / UNION / GRAPH
ORDER BY
LIMIT
OFFSET

h4_circle.png Syntax 설명

1) PREFIX

<설명>
  • 아래와 같이 질의에서 사용되는 Prefix를 정의한다.
  • prefix seoul: <http://lod.seoul.go.kr/ontology/>
  • prefix bibo: <http://purl.org/ontology/bibo/>
< 사용 예>
PREFIX 사용 예의 화면 캡쳐

2) ORDER BY

<설명>
  • 결과를 sort 한다.
  • 뒤에 sort할 변수가 오며, ASC(변수) 또는 DESC(변수)를 사용하여 정렬 순서를 정할 수 있다. 디폴트는 ASC이며 다중 정렬도 가능하다.
  • CONSTRUCT 나 DESCRIBE 에서는 Order By의 사용이 가능하지만 그 결과에는 아무런 영향을 끼치지 않는다.
  • ASK 에서는 Order By 를 사용할 수 없다.
  • 정렬 순서는 특정 Term들 사이에서 Fixed 되어 있다.
  • 주의 : order by는 대용량 트리플의 경우 시스템 성능 저하를 초래할 수 있습니다.
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns# >
PREFIX schema: <http://schema.org/>
SELECT *
WHERE {
?place rdf:type schema:Library .
?place ?property ?value .
} order by ?value LIMIT 50

3) LIMIT

<설명>
  • 결과 개수를 제한한다
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns# >
PREFIX schema: <http://schema.org/>
SELECT *
WHERE {
?place rdf:type schema:Library .
?place ?property ?value .
} LIMIT 50

4) OFFSET

<설명>
  • 결과를 가져올 시작 번호를 정할 수 있다
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX schema: <http://schema.org/>
SELECT *
WHERE {
?place rdf:type schema:Library .
?place ?property ?value .
} LIMIT 5 OFFSET 10

5) WHERE

<설명>
  • 쿼리의 조건을 명시한다
  • Graph Pattern / OPTIONAL / FILTER / UNION / GRAPH 등을 사용하여 조건 생성이 가능하다

6) OPTIONAL

<설명>
  • 1. pattern OPTIONAL { pattern }
  • 2. { OPTIONAL { pattern } }
  • 3. { { } OPTIONAL { pattern } }
  • 4. pattern OPTIONAL { pattern } OPTIONAL { pattern }
  • 5. { pattern OPTIONAL { pattern } } OPTIONAL { pattern }
  •        * 2번과 3번은 동일
  •        * 4번과 5번은 동일 (왼쪽부터 연산된다.)
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX seoul: <http://lod.seoul.go.kr/ontology/>
PREFIX schema: <http://schema.org/>
PREFIX juso: <http://rdfs.co/juso/>
SELECT ?station ?ko ?en ?ja ?zh ?origin
WHERE {
?station rdf:type schema:SubwayStation .
?station rdfs:label ?ko .
FILTER ( lang(?ko) = "ko" )
?station seoul:origin ?origin .
OPTIONAL {
?station rdfs:label ?en .
FILTER ( lang(?en) = "en" )
?station rdfs:label ?ja .
FILTER ( lang(?ja) = "ja" )
?station rdfs:label ?zh .
FILTER ( lang(?zh) = "zh" )
}
} LIMIT 50

7) FILTER

<설명>
  • Filter는 아래에 설명된 표와 같이 다양한 연산을 사용하여 조건에 대한 제한이 가능하며 이를 위해 다양한 연산방법을 제공한다.
Operator Type(A) Function Result type
XQuery Unary Operators
! A xsd:boolean (EBV) fn:not(A)

xsd:boolean

+ A numeric op:numeric-unary-plus(A) numeric
- A numeric

op:numeric-unary-minus(A)

numeric
SPARQL Tests, defined in section 11.4
BOUND (A) variable bound(A) xsd:boolean
isIRI (A)
isURI (A)
RDF term isIRI(A) xsd:boolean
isBLANK (A) RDF term isBlank(A) xsd:boolean
isLITERAL (A) RDF term isLiteral(A) xsd:boolean
SPARQL Accessors, defined in section 11.4
STR (A) literal str(A) simple literal
STR (A) IRI str(A) simple literal
LANG (A) literal lang(A) simple literal
DATATYPE (A) typed literal datatype(A) IRI
DATATYPE (A) simple literal datatype(A) IRI
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX seoul: <http://lod.seoul.go.kr/ontology/>
PREFIX schema: <http://schema.org/>
SELECT *
WHERE {
?foodEstablishment rdf:type schema:FoodEstablishment .
?foodEstablishment rdfs:label ?name .
FILTER regex(str(?name), "해장국")
} LIMIT 50

8) UNION

<설명>
  • 아래의 질의문과 같이 두 개 이상의 질의문 조건을 Union하여 결과를 조회 한다.
<LOD 사용 예>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
SELECT *
WHERE {
{ ?place rdf:type schema:ArtGallery .
?place rdfs:label ?name .
FILTER regex(str(?name), "예술의전당")
?place schema:telephone ?tel .
?place schema:url ?url .
?place schema:openingHours ?open .
}
UNION
{ ?place rdf:type schema:ArtGallery .
?place rdfs:label ?name .
FILTER regex(str(?name), "삼성미술관")
?place schema:telephone ?tel .
?place schema:url ?url .
?place schema:openingHours ?open .
}
}

9) SELECT

<설명>
  • 변수들과 그 변수들의 값을 return 한다.
  • select 뒤에는 가져올 변수를 선언해야 한다.
  • 여러 개의 변수들은 공백으로 구분한다.
  • 쿼리에서 사용된 모든 변수를 SELECT 하기 위해서 ‘*’ 문자를 사용할 수 있다.