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

hiblue
이동: 둘러보기, 검색
(Namespace)
(Optional)
 
(같은 사용자의 중간 판 107개는 보이지 않습니다)
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의 형식으로 이루어진, 누구나 사용할 수 있도록 공개된 데이터베이스를 제공하는 서비스를 말한다.
  
그래프 데이터베이스가 되기 위해서, triplestore는 개체 간의 관계를 보여주는 네트워크의 형식으로 데이터를 저장한다. 이것이 연결 관계가 중요한 데이터를 관리하는데에 RDF triplestore를 사용하는 것을 선호하게 만들었다. 예를 들어, Triplestore는 관계형 데이터베이스보다 더 유연하고, 경제적이다.
+
==온톨로지==
 +
*Data Propery : 특정 값으로 표현되는 속성
 +
*Object Propery : 특정 개체로 연결되는 속성
 +
*rdfs:label / rdf:type
  
시맨틱 그래프 데이터베이스로 불리는 '''RDF 데이터베이스'''는 강력한 의미기반 쿼리들을 다루는 것과, 기존 관계에서 벗어나 새로운 관계를 발견하기 위한 추론을 사용하는 것이 가능하다.
+
==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/> .
  
다른 그래프 데이터베이스와 다르게, RDF triplestore 엔진은 온톨로지라는 선택가능한 스키마 모델을 사용한다. 온톨로지는 데이터의 공식적인 기술을 가능하게 해준다. 그들은 개체의 클래스와 관계 속성(relationship properties), 그리고 그들의 계층 구조를 명시한다.
+
<#green-goblin>
 +
    rel:enemyOf <#spiderman> ;
 +
    a foaf:Person ;
 +
    foaf:name "Green Goblin" .
  
  주어(Subject) --서술어(Predicate/Verb)--> 목적어(Object)
+
</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>
 +
 
 +
===기본형태===
 +
SELECT ?A(변수) ?B(변수)
 +
WHERE
 +
{ ?A(변수) Prefix:relation ?B(변수) .
 +
}
 +
*'''?''' : 변수의 앞에 붙임.(변수임을 표시)
 +
*''';''' : 특정 변수에 조건을 추가할 때 (and)
 +
*'''.''' : 기존에 선언된 변수와 관계 없이 새로운 개체나 조건을 명시할 때(end)
 +
*'''#''' : comment (주석)
 +
 
 +
===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>
 +
 
 +
===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)
  
RDF triplestore에 있는 데이터는 triple이라 불리는 관계로 저장되기 때문에, triplestore라 불린다. (Triple은 Statement, RDF Statement라고도 불린다)
+
===ASK===
'''Subject->Predicate->Object'''의 형식은 어떤 주제나 개념을 서술어를 통해 서로 연결됨을 보여준다. 예를 들어, 'Joe sells books'는 triplestore에 RDF triple 형식으로 저장될 수 있고, 문장의 주어인 Joe와 목적어인 Books사이의 관계를 보여준다. 서술어 "Sells"는 주어와 목적어가 어떻게 연결되는 지를 보여준다.
+
*특정 조건에 해당하는 값이 있는지 없는지를 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>
  
RDF Triplestore와 Linked Data에서의 중심 개념은 URL(the Universal Resources Identifier)이다. URL는 웹에서 사용되는 유일한 세계 식별 시스템으로, ID의 일종이다.
+
===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 ||
 +
|}
  
==Linked Data와 RDF Triplestore[https://ontotext.com/knowledgehub/fundamentals/what-is-rdf-triplestore/]==   
+
===참고자료===
RDF triplestore 데이터베이스는 각 개체들이 연결되어 있고 RDF 형식을 갖추고 있는 DBPedia와 GeoNames 같은 Linked Open Data의 데이터들을 성공적으로 관리하는데 쓰인다. Linked Open Data를 사용하면 연합 쿼리를 훨씬 빠르게 쿼리하고 응답할 수 있으며 관련성이 높은 검색결과를 얻을 수 있습니다. Triplestore는 다양한 소스에서 발전하는 데이터를 더 경제적이고, 적은 시간을 들여 다양하게 쿼리할 수 있도록 노력합니다. 보편적인 기준이 RDF triplestore에 적용되기 때문에, 그들은 한 triplestore에서 다른 것으로 이동할 수 잇는 데이터를 만든다.
+
*[https://www.w3.org/2001/sw/DataAccess/rq23/ W3C SPARQL Query Language for RDF]
==SPARQL==
+
*[http://www.iro.umontreal.ca/~lapalme/ift6281/sparql-1_1-cheat-sheet.pdf SPARQL Cheat Sheet by LeeFeigenbaum]
===Namespace===
+
==실습==
데이터들이 어떤 층위에 속해 있는지를 지정해놓는 공간. 이름이 같은 데이터라도 층위에 따라 다른 의미를 가질 수 있다
+
*[http://dh.aks.ac.kr:8890/sparql Encyves SparQL Endpoint]
prefix:IRI
+
{|class="tableA"
ex) @prefix:rdf <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+
!문제 !! 예시
 +
|-
 +
| 세종과 관련 있는 것들 || 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/>
  
한국사 LOD 실습
+
select ?clodName where {
*부모와 자식관계인 인물들
+
service <http://www.culture.go.kr/lod/sparql> {
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+
?clod rdfs:label ?clodName.
PREFIX hlod: <http://lod.koreanhistory.or.kr/>
+
?clod rdf:type cfo:ClassicalObject.
select ?father ?son
+
}
where {?father hlod:hasChild ?son} limit 50
+
}limit 20
 +
</pre>
 +
|-
 +
| 관광공사에서 위경도정보 || <pre>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 </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