"SPARQL Tutorial"의 두 판 사이의 차이

hiblue
이동: 둘러보기, 검색
(Optional)
 
(같은 사용자의 중간 판 110개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==RDF Triplestore[https://ontotext.com/knowledgehub/fundamentals/what-is-rdf-triplestore/]==
+
==RDF Triplestore와 LOD(Linked Open Data) 서비스==
RDF triplestore는 시맨틱 정보를 저장하는 그래프 데이터베이스의 형태 중 하나이다. 자원 기술 형식(Resource Description Framework)을 의미하는 RDF는 W3C에서 표준화한, 데이터의 기술과 교환을 위한 모델이다.
+
주어(Subject) --서술어(Predicate/Verb)--> 목적어(Object)
 +
::웹 상의 시맨틱 정보를 저장하는 그래프 데이터베이스의 형태로, 스키마 모델 - 온톨로지를 이용한다.
 +
::LOD는  RDF의 형식으로 이루어진, 누구나 사용할 수 있도록 공개된 데이터베이스를 제공하는 서비스를 말한다.
 +
 
 +
==온톨로지==
 +
*Data Propery : 특정 값으로 표현되는 속성
 +
*Object Propery : 특정 개체로 연결되는 속성
 +
*rdfs:label / rdf:type
 +
 
 +
==RDF 표현형식==
 +
*Turtle
 +
<pre>
 +
@base <http://example.org/> .
 +
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 +
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
 +
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
 +
@prefix rel: <http://www.perceive.net/schemas/relationship/> .
 +
 
 +
<#green-goblin>
 +
    rel:enemyOf <#spiderman> ;
 +
    a foaf:Person ;
 +
    foaf:name "Green Goblin" .
  
그래프 데이터베이스가 되기 위해서, triplestore는 개체 간의 관계를 보여주는 네트워크의 형식으로 데이터를 저장한다. 이것이 연결 관계가 중요한 데이터를 관리하는데에 RDF triplestore를 사용하는 것을 선호하게 만들었다. 예를 들어, Triplestore는 관계형 데이터베이스보다 더 유연하고, 경제적이다.
+
</pre>
 +
*[http://dh.aks.ac.kr:8890/sparql?default-graph-uri=&query=PREFIX+ekc%3A+%3Chttp%3A%2F%2Fdh.aks.ac.kr%2Fontologies%2Fekc%23%3E%0D%0APREFIX+ekci%3A+%3Chttp%3A%2F%2Fdh.aks.ac.kr%2Firi%2Fekc%23%3E%0D%0APREFIX+owl%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2002%2F07%2Fowl%23%3E%0D%0APREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0D%0APREFIX+xml%3A+%3Chttp%3A%2F%2Fwww.w3.org%2FXML%2F1998%2Fnamespace%3E%0D%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0APREFIX+dcterms%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%23%3E%0D%0APREFIX+foaf%3A+%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E+%0D%0APREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%23%3E%0D%0APREFIX+edm%3A+%3Chttp%3A%2F%2Fwww.europeana.eu%2Fschemas%2Fedm%23%3E%0D%0A%0D%0Aselect+ekci%3A%EC%A1%B0%EC%84%A0_%EC%84%B8%EC%A2%85+%3Frel+%3FB+where%7B+ekci%3A%EC%A1%B0%EC%84%A0_%EC%84%B8%EC%A2%85+%3Frel+%3FB%7D&should-sponge=&format=text%2Fplain&timeout=0&debug=on N-Triples]
 +
*[http://dh.aks.ac.kr/~hiblue/sparql.xml RDF/XML]
 +
*[http://dh.aks.ac.kr:8890/sparql?default-graph-uri=&query=PREFIX+ekc%3A+%3Chttp%3A%2F%2Fdh.aks.ac.kr%2Fontologies%2Fekc%23%3E%0D%0APREFIX+ekci%3A+%3Chttp%3A%2F%2Fdh.aks.ac.kr%2Firi%2Fekc%23%3E%0D%0APREFIX+owl%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2002%2F07%2Fowl%23%3E%0D%0APREFIX+rdf%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%0D%0APREFIX+xsd%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%0D%0APREFIX+xml%3A+%3Chttp%3A%2F%2Fwww.w3.org%2FXML%2F1998%2Fnamespace%3E%0D%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0APREFIX+dcterms%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%23%3E%0D%0APREFIX+foaf%3A+%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E+%0D%0APREFIX+dc%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%23%3E%0D%0APREFIX+edm%3A+%3Chttp%3A%2F%2Fwww.europeana.eu%2Fschemas%2Fedm%23%3E%0D%0A%0D%0Aselect+ekci%3A%EC%A1%B0%EC%84%A0_%EC%84%B8%EC%A2%85+%3Frel+%3FB+where%7B+ekci%3A%EC%A1%B0%EC%84%A0_%EC%84%B8%EC%A2%85+%3Frel+%3FB%7D&should-sponge=&format=text%2Fhtml&timeout=0&debug=on HTML]
 +
==SPARQL==
 +
===Prefix===
 +
<pre>
 +
PREFIX ekc: <http://dh.aks.ac.kr/ontologies/ekc#>
 +
PREFIX ekci: <http://dh.aks.ac.kr/iri/ekc#>
 +
PREFIX owl: <http://www.w3.org/2002/07/owl#>
 +
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
 +
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
 +
PREFIX xml: <http://www.w3.org/XML/1998/namespace>
 +
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
 +
PREFIX dcterms: <http://purl.org/dc/terms#>
 +
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
 +
PREFIX dc: <http://purl.org/dc/elements/1.1#>
 +
PREFIX edm: <http://www.europeana.eu/schemas/edm#>
 +
</pre>
  
시맨틱 그래프 데이터베이스로 불리는 '''RDF 데이터베이스'''는 강력한 의미기반 쿼리들을 다루는 것과, 기존 관계에서 벗어나 새로운 관계를 발견하기 위한 추론을 사용하는 것이 가능하다.
+
===기본형태===
 +
SELECT ?A(변수) ?B(변수)
 +
WHERE
 +
{ ?A(변수) Prefix:relation ?B(변수) .
 +
}
 +
*'''?''' : 변수의 앞에 붙임.(변수임을 표시)
 +
*''';''' : 특정 변수에 조건을 추가할 때 (and)
 +
*'''.''' : 기존에 선언된 변수와 관계 없이 새로운 개체나 조건을 명시할 때(end)
 +
*'''#''' : comment (주석)
  
다른 그래프 데이터베이스와 다르게, RDF triplestore 엔진은 온톨로지라는 선택가능한 스키마 모델을 사용한다. 온톨로지는 데이터의 공식적인 기술을 가능하게 해준다. 그들은 개체의 클래스와 관계 속성(relationship properties), 그리고 그들의 계층 구조를 명시한다.
+
===Filter===
 +
*조건문, Where 대괄호 안에 넣어 검색할 개체가 가질 특정 조건을 부여
 +
WHERE { FILTER( ?A >300; ?B = "title" ) }
 +
*[https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D 정규표현식] 사용
 +
WHERE { FILTER REGEX( ?A, "정규표현식") }
 +
<span style="color:DarkCyan"> filter regex( ?A, "(BBB)+") : 특정문구(BBB)가 포함된 A</span><br/>
 +
<span style="color:DarkCyan"> filter regex( ?A, "^(BBB)") : 특정문구(BBB)로 시작하는 A</span><br/>
 +
<span style="color:DarkCyan"> filter regex( ?A, "(BBB)$") : 특정문구(BBB)로 끝나는 A</span>
  
  주어(Subject) --서술어(Predicate/Verb)--> 목적어(Object)
+
===Optional===
 +
*추가사항, Where 대괄호 안에 넣어 검색할 개체를 보여주되, 특정 속성을 가진 경우 그 특정 속성을 보여줌
 +
  WHERE { OPTIONAL { ?A prefix:title_ZH ?title_Z}}
 +
*filer와 함께 사용 가능 : <span style="color:darkcyan">OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }</span>
 +
 
 +
===UNION===
 +
*합집합, 값을 나란한 열이 아닌, 여러 행으로 보여줌
 +
WHERE  { { ?book dc10:title  ?title } UNION { ?book dc11:title  ?title } }
 +
===GRAPH / FROM ===
 +
*특정 개체의 주소(DB)을 나타낼 때
 +
WHERE { GRAPH ?src { ?A rdfs:label ?name} }
 +
*특정 DB로 제한할 때
 +
SELECT  ?name
 +
FROM    <http://example.org/foaf/aliceFoaf>
 +
WHERE  { ?x foaf:name ?name }
 +
===Order By / Limit / Offset===
 +
*Order by : 정렬 / Limit : 값의 갯수 제한 / Offset: 값 중 몇개의 값을 제외
 +
WHERE {?x rdfs:label ?title}
 +
order by desc(?title)
 +
limit 100
 +
offset 50
 +
===Distintct / Count / AS===
 +
*sql에서의 기능과 같음  / 특정 조건을 가진 개체의 갯수
 +
select distinct ?rel count(*)
 +
where { ?a ?rel ?b. }
 +
 
 +
*'''AS''' : (count(*) AS ?number)
 +
 
 +
===ASK===
 +
*특정 조건에 해당하는 값이 있는지 없는지를 yes/no의 값으로 보여줌.
 +
ASK  { ?x foaf:name  "Alice" }
 +
===Update===
 +
*INSERT DATA { ?A rel ?B }
 +
*DELETE DATA { ?A rel ?B }
 +
*[DELETE { template }] [INSERT {template}] where {pattern}
 +
*CLEAR GRAPH <uri>
 +
*CREATE GRAPH <uri>
 +
*DROP GRAPH <uri>
 +
 
 +
===Filter와 함께 쓰는 기타 기능들===
 +
{|class="tableA"
 +
!명칭 !! 기능!!사용예시
 +
|-
 +
|bound || 값이 있는 경우 is not null<br/>특정 값이 없는 경우 is null : !bound || FILTER(bound(?date))
 +
|-
 +
|isLiteral || 값이 문자인 경우 || FILTER(isLiteral(?date))
 +
|-
 +
|str || 값을 문자형태로 변환 ||  FILTER regex(str(?mbox), "@work.example") 
 +
|-
 +
|lang || 값이 어느 언어를 사용하지를 명시(Languagage 태그)<br/>한국어 KO / 영어 EN / 일본어 JA / 중국-간체 ZH-HANS / 중국-번체 ZH-HANT  ||  FILTER ( lang(?name) = "ES" )
 +
|-
 +
|&& || and ||
 +
|-
 +
|<nowiki>||</nowiki> || or ||
 +
|}
 +
 
 +
===참고자료===
 +
*[https://www.w3.org/2001/sw/DataAccess/rq23/ W3C SPARQL Query Language for RDF]
 +
*[http://www.iro.umontreal.ca/~lapalme/ift6281/sparql-1_1-cheat-sheet.pdf SPARQL Cheat Sheet by LeeFeigenbaum]
 +
==실습==
 +
*[http://dh.aks.ac.kr:8890/sparql Encyves SparQL Endpoint]
 +
{|class="tableA"
 +
!문제 !! 예시
 +
|-
 +
| 세종과 관련 있는 것들 || SELET ekci:조선_세종 ?rel ?B WHERE {ekci:조선_세종 ?rel ?B }
 +
|-
 +
| 아버지와 아들 관계 || SELECT ?A ?B WHERE {?A ekc:hasSon ?B}
 +
|-
 +
| 조선의 왕들과 왕의 아내 || SELECT ?A ?B WHERE {?A ekc:hasWife ?B FILTER regex(str(?A), "(조선_)+")}
 +
|-
 +
| 왕비의 이름, 왕비가 낳은 아들 || <nowiki>SELECT ?name ?son WHERE {?A rdfs:label ?name; ekc:hasSon ?son. FILTER regex(str(?A), "(왕비|왕후|황후|태후|대비)+")}</nowiki>
 +
|-
 +
|가장 많이 사용된 관계어 || SELECT ?rel (count(*) as ?count) FROM <http://localhost:8890/ekc> WHERE {?A ?rel ?B} GROUP BY ?rel ORDER BY desc(count(*))
 +
|-
 +
| 문화융합LOD에서 불러오기 || <pre> PREFIX cfo: <http://www.culture.go.kr/lod/ontology/>
 +
 
 +
select ?clodName where {
 +
service <http://www.culture.go.kr/lod/sparql> {
 +
?clod rdfs:label ?clodName.
 +
?clod rdf:type cfo:ClassicalObject.
 +
}
 +
}limit 20
 +
</pre>
 +
|-
 +
| 관광공사에서 위경도정보 || <pre>PREFIX wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#>
  
RDF triplestore에 있는 데이터는 관계를 가지고 저장된다.
+
select * where {
 +
?ekc rdfs:label ?ekcName.
 +
?ekc rdf:type ekc:Place.
 +
service <http://data.visitkorea.or.kr/sparql>  {
 +
?ids rdfs:label ?idsName.
 +
  ?ids wgs:lat ?lat.
 +
  ?ids wgs:long ?long.
 +
filter (?ekcName = ?idsName)
 +
}
 +
}limit 20 </pre>
 +
|-
 +
|}

2018년 3월 2일 (금) 14:48 기준 최신판

RDF Triplestore와 LOD(Linked Open Data) 서비스

주어(Subject) --서술어(Predicate/Verb)--> 목적어(Object)
웹 상의 시맨틱 정보를 저장하는 그래프 데이터베이스의 형태로, 스키마 모델 - 온톨로지를 이용한다.
LOD는 RDF의 형식으로 이루어진, 누구나 사용할 수 있도록 공개된 데이터베이스를 제공하는 서비스를 말한다.

온톨로지

  • Data Propery : 특정 값으로 표현되는 속성
  • Object Propery : 특정 개체로 연결되는 속성
  • rdfs:label / rdf:type

RDF 표현형식

  • Turtle
@base <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rel: <http://www.perceive.net/schemas/relationship/> .

<#green-goblin>
    rel:enemyOf <#spiderman> ;
    a foaf:Person ; 
    foaf:name "Green Goblin" .

SPARQL

Prefix

PREFIX ekc: <http://dh.aks.ac.kr/ontologies/ekc#>
PREFIX ekci: <http://dh.aks.ac.kr/iri/ekc#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX xml: <http://www.w3.org/XML/1998/namespace>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dcterms: <http://purl.org/dc/terms#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX dc: <http://purl.org/dc/elements/1.1#>
PREFIX edm: <http://www.europeana.eu/schemas/edm#>

기본형태

SELECT ?A(변수) ?B(변수)
WHERE
{ ?A(변수) Prefix:relation ?B(변수) .
}
  • ? : 변수의 앞에 붙임.(변수임을 표시)
  • ; : 특정 변수에 조건을 추가할 때 (and)
  • . : 기존에 선언된 변수와 관계 없이 새로운 개체나 조건을 명시할 때(end)
  • # : comment (주석)

Filter

  • 조건문, Where 대괄호 안에 넣어 검색할 개체가 가질 특정 조건을 부여
WHERE { FILTER( ?A >300; ?B = "title" ) }
WHERE { FILTER REGEX( ?A, "정규표현식") }

filter regex( ?A, "(BBB)+") : 특정문구(BBB)가 포함된 A
filter regex( ?A, "^(BBB)") : 특정문구(BBB)로 시작하는 A
filter regex( ?A, "(BBB)$") : 특정문구(BBB)로 끝나는 A

Optional

  • 추가사항, Where 대괄호 안에 넣어 검색할 개체를 보여주되, 특정 속성을 가진 경우 그 특정 속성을 보여줌
WHERE { OPTIONAL { ?A prefix:title_ZH ?title_Z}}
  • filer와 함께 사용 가능 : OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }

UNION

  • 합집합, 값을 나란한 열이 아닌, 여러 행으로 보여줌
WHERE  { { ?book dc10:title  ?title } UNION { ?book dc11:title  ?title } }

GRAPH / FROM

  • 특정 개체의 주소(DB)을 나타낼 때
WHERE { GRAPH ?src { ?A rdfs:label ?name} } 
  • 특정 DB로 제한할 때
SELECT  ?name
FROM    <http://example.org/foaf/aliceFoaf>
WHERE   { ?x foaf:name ?name }

Order By / Limit / Offset

  • Order by : 정렬 / Limit : 값의 갯수 제한 / Offset: 값 중 몇개의 값을 제외
WHERE {?x rdfs:label ?title} 
order by desc(?title) 
limit 100 
offset 50

Distintct / Count / AS

  • sql에서의 기능과 같음 / 특정 조건을 가진 개체의 갯수
select distinct ?rel count(*)
where { ?a ?rel ?b. }
  • AS : (count(*) AS ?number)

ASK

  • 특정 조건에 해당하는 값이 있는지 없는지를 yes/no의 값으로 보여줌.
ASK  { ?x foaf:name  "Alice" }

Update

  • INSERT DATA { ?A rel ?B }
  • DELETE DATA { ?A rel ?B }
  • [DELETE { template }] [INSERT {template}] where {pattern}
  • CLEAR GRAPH <uri>
  • CREATE GRAPH <uri>
  • DROP GRAPH <uri>

Filter와 함께 쓰는 기타 기능들

명칭 기능 사용예시
bound 값이 있는 경우 is not null
특정 값이 없는 경우 is null : !bound
FILTER(bound(?date))
isLiteral 값이 문자인 경우 FILTER(isLiteral(?date))
str 값을 문자형태로 변환 FILTER regex(str(?mbox), "@work.example")
lang 값이 어느 언어를 사용하지를 명시(Languagage 태그)
한국어 KO / 영어 EN / 일본어 JA / 중국-간체 ZH-HANS / 중국-번체 ZH-HANT
FILTER ( lang(?name) = "ES" )
&& and
|| or

참고자료

실습

문제 예시
세종과 관련 있는 것들 SELET ekci:조선_세종 ?rel ?B WHERE {ekci:조선_세종 ?rel ?B }
아버지와 아들 관계 SELECT ?A ?B WHERE {?A ekc:hasSon ?B}
조선의 왕들과 왕의 아내 SELECT ?A ?B WHERE {?A ekc:hasWife ?B FILTER regex(str(?A), "(조선_)+")}
왕비의 이름, 왕비가 낳은 아들 SELECT ?name ?son WHERE {?A rdfs:label ?name; ekc:hasSon ?son. FILTER regex(str(?A), "(왕비|왕후|황후|태후|대비)+")}
가장 많이 사용된 관계어 SELECT ?rel (count(*) as ?count) FROM <http://localhost:8890/ekc> WHERE {?A ?rel ?B} GROUP BY ?rel ORDER BY desc(count(*))
문화융합LOD에서 불러오기
 PREFIX cfo: <http://www.culture.go.kr/lod/ontology/>

select ?clodName where {
service <http://www.culture.go.kr/lod/sparql> {
?clod rdfs:label ?clodName.
?clod rdf:type cfo:ClassicalObject.
}
}limit 20
관광공사에서 위경도정보
PREFIX wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select * where {
?ekc rdfs:label ?ekcName.
?ekc rdf:type ekc:Place.
service <http://data.visitkorea.or.kr/sparql>  { 
 ?ids rdfs:label ?idsName.
  ?ids wgs:lat ?lat.
   ?ids wgs:long ?long.
 filter (?ekcName = ?idsName)
}
}limit 20