SPARQL 활용
SPARQL 의 질의형식
- SPARQL 질의 형식은 개략적으로 아래와 같다.
- 질의에서 사용되는 변수는 "? 변수명" 또는 "$변수명" 과 같은 형태로 사용한다.
PREFIX
SELECT / CONSTRUCT / ASK / DESCRIBE
(DISTINCT / REDUCED)
FROM(NAMED)
WHERE
Graph Pattern / OPTIONAL / FILTER / UNION / GRAPH
ORDER BY
LIMIT
OFFSET
Syntax 설명
1) PREFIX
<설명>
- 아래와 같이 질의에서 사용되는 Prefix를 정의한다.
- prefix seoul: <http://lod.seoul.go.kr/ontology/>
- prefix bibo: <http://purl.org/ontology/bibo/>
< 사용 예>

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
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
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
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
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 | 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
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 .
}
}
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 하기 위해서 ‘*’ 문자를 사용할 수 있다.