logo

SPARQL

SPARQL이란 무엇입니까

SPARQL(SPARQL Protocol and RDF Query Language)은 RDF 그래프를 질의하기 위한 표준 언어입니다. 관계형 데이터베이스에서 SQL을 사용하듯이, RDF 저장소에서는 SPARQL로 원하는 트리플 패턴을 찾습니다.

SPARQL의 핵심은 그래프 안에서 조건에 맞는 주어, 술어, 목적어 패턴을 찾는 것입니다.

기본 질의

다음 데이터가 있다고 가정합니다.

@prefix ex: <http://example.org/> .

ex:Alice ex:bought ex:Book001 .
ex:Book001 ex:title "지식 그래프 입문" .

앨리스가 구입한 상품의 제목은 다음과 같이 찾을 수 있습니다.

PREFIX ex: <http://example.org/>

SELECT ?item ?title
WHERE {
  ex:Alice ex:bought ?item .
  ?item ex:title ?title .
}

?item?title은 변수입니다. WHERE 안의 패턴을 만족하는 값이 결과로 반환됩니다.

SPARQL은 데이터 그래프에서 WHERE의 트리플 패턴과 맞는 부분을 찾아 변수 값을 채웁니다.

flowchart TB
    subgraph data["데이터 그래프"]
        alice["ex:Alice"]
        book["ex:Book001"]
        title["지식 그래프 입문"]
        alice -- "ex:bought" --> book
        book -- "ex:title" --> title
    end

    subgraph pattern["WHERE 패턴"]
        p1["ex:Alice ex:bought ?item"]
        p2["?item ex:title ?title"]
    end

    p1 -. "?item = ex:Book001" .-> book
    p2 -. "?title = 지식 그래프 입문" .-> title

여러 조건 연결

SPARQL에서는 여러 트리플 패턴을 함께 적으면 모두 만족해야 합니다. 이는 논리적으로 "그리고" 조건입니다.

PREFIX ex: <http://example.org/>

SELECT ?customer ?item
WHERE {
  ?customer ex:bought ?item .
  ?item ex:category ex:Book .
}

위 질의는 도서 카테고리의 상품을 구입한 고객과 상품을 찾습니다.

필터

FILTER는 값에 대한 조건을 추가할 때 사용합니다.

PREFIX ex: <http://example.org/>

SELECT ?item ?price
WHERE {
  ?item ex:price ?price .
  FILTER (?price >= 30000)
}

이 질의는 가격이 30000 이상인 상품을 찾습니다.

선택적 패턴

OPTIONAL은 있으면 가져오고 없어도 결과에서 제외하지 않는 조건입니다.

PREFIX ex: <http://example.org/>

SELECT ?item ?title ?author
WHERE {
  ?item ex:title ?title .
  OPTIONAL {
    ?item ex:author ?author .
  }
}

저자 정보가 없는 상품도 결과에 포함됩니다. 저자 값만 비어 있게 됩니다.

집계

GROUP BY와 집계 함수를 사용하면 그룹별 통계를 계산할 수 있습니다.

PREFIX ex: <http://example.org/>

SELECT ?customer (COUNT(?item) AS ?count)
WHERE {
  ?customer ex:bought ?item .
}
GROUP BY ?customer

이 질의는 고객별 구매 상품 수를 계산합니다.

생성 질의

CONSTRUCT는 조회 결과로 새로운 RDF 그래프를 만듭니다. 기존 그래프에서 필요한 구조만 추출하거나 변환할 때 유용합니다.

PREFIX ex: <http://example.org/>

CONSTRUCT {
  ?customer ex:interestedIn ?category .
}
WHERE {
  ?customer ex:bought ?item .
  ?item ex:category ?category .
}

이 질의는 구매 이력을 바탕으로 고객의 관심 카테고리 관계를 생성합니다.

파이썬에서 실행하기

RDFLib 그래프에서는 다음처럼 SPARQL을 실행할 수 있습니다.

result = g.query("""
PREFIX ex: <http://example.org/>

SELECT ?item
WHERE {
  ex:Alice ex:bought ?item .
}
""")

for row in result:
    print(row.item)

간단한 실습에는 충분하지만, 대규모 데이터에는 전용 RDF 저장소를 사용하는 것이 좋습니다.

정리

SPARQL은 RDF 그래프에서 원하는 패턴을 찾고, 필터링하고, 집계하고, 새로운 그래프를 만들기 위한 질의 언어입니다. 핵심은 표 형태의 행을 찾는 것이 아니라 그래프 패턴을 맞추는 것입니다.

Previous
SKOS