Upload
myungjin-lee
View
381
Download
4
Embed Size (px)
Citation preview
LOD 실습
Part 1. LOD의 기본 개념
2017-02-28
워크샵 프로그램
시간 제목 발표자
13:30~14:10 Part 1. LOD의 기본 개념 이명진
14:10~14:50 Part 2. LOD 모델 이명진
14:50~15:30 Part 3. SPARQL 이명진
15:30~15:50 Coffee Break
15:50~16:20 Part 4. 실습 – 모델의 이해 허홍수
16:20~17:00 Part 4. 실습 – SPARQL 허홍수
17:00~17:30 Part 4. 실습 – 프로그래밍 허홍수
웹에서 생성되는 정보의 양
현재의 웹
• HTML – 사람이 읽고 해석할 수 있는 연결된 문서를 만드는 것
? 정보의 재사용!!!
만약…
• 재사용성, 기계에 의한 가독성, 새로운 서비스 생산성 향상
유라에 대한 정보를 줘.
{
"name": "유라",
"realName": "김아영",
"job": "가수",
"birth": "1992.11.6",
"bodySize": {
"height": 168,
"weight": 49
},
"group": {
"groupName": "걸스데이",
"groupUrl": "http://www.naver.com/GirlsDay"
},
"pic": "http://www.naver.com/GirlsDay/Yura.jpg"
}
Linked Open Data
Linked Open Data
웹을 통해 사람과 기계가
읽고 처리할 수 있는 형태로 데이터에 대한 정보를 기술(description)
웹 페이지가 서로 연결된 것처럼 데이터들끼리 다양한 관계에 의해
연결되어 있는 형태
URI를 이용해서 누구나 데이터에 접근할 수 있으며
데이터에 대한 정보를 제공
LOD의 네 가지 원칙
1. 웹 상의 자원을 식별하기 위해 URI를 사용하라.
2. 웹 상의 자원들이 사람과 사용자 에이전트에 의해 참조(refer)되고 탐색(look up)될 수 있는 HTTP URI를 사용하라.
3. 자원의 URI가 역참조(dereference)될 때 자원에 대한 유용한 정보를 RDF/XML과 같은 표준 형식을 사용하여 제공하라.
4. 웹에서 다른 연관된 정보의 탐색을 개선하기 위해 다른 데이터와의 URI 연결(link)를 포함하라.
LOD의 형태
http://cafe.naver.com/yurasmarbling#me
유라
김아영
November 6, 1992
168
49
http://www.naver.com/GirlsDay/Yura.jpg
http://cafe.daum.net/Girlsday5#me
걸스데이
http://xmlns.com/foaf/0.1/nick
http://xmlns.com/foaf/0.1/name
http://xmlns.com/foaf/0.1/birthday
http://xmlns.com/foaf/0.1/height
http://xmlns.com/foaf/0.1/weight
http://xmlns.com/foaf/0.1/depiction
http://xmlns.com/foaf/0.1/member
http://xmlns.com/foaf/0.1/name
http://cafe.daum.net/Girlsday5
http://xmlns.com/foaf/0.1/homepage
웹에서의 LOD
LOD Service
<foaf:Person
rdf:about="http://cafe.naver.com/yurasmarbling#me">
<foaf:nick>유라</foaf:nick>
<foaf:name>김아영</foaf:name>
<foaf:birthday>November 6, 1992</foaf:birthday>
<foaf:height>168</foaf:height>
<foaf:weight>49</foaf:weight>
<foaf:depiction
rdf:resource="http://www.naver.com/GirlsDay/Yura.jpg" />
</foaf:Person>
RDF/XML
http://cafe.naver.com/yurasmarbling#me
유라
김아영
November 6, 1992
168
49
http://www.naver.com/GirlsDay/Yura.jpg
http://cafe.daum.net/Girlsday5#me
걸스데이
http://xmlns.com/foaf/0.1/nick
http://xmlns.com/foaf/0.1/name
http://xmlns.com/foaf/0.1/birthday
http://xmlns.com/foaf/0.1/height
http://xmlns.com/foaf/0.1/weight
http://xmlns.com/foaf/0.1/depiction
http://xmlns.com/foaf/0.1/member
http://xmlns.com/foaf/0.1/name
http://cafe.daum.net/Girlsday5
http://xmlns.com/foaf/0.1/homepage
LOD를 위한 요소 기술들
문서 내부의 구조화된 콘텐츠를
기계가 읽고 처리 가능한 형태로 표기하기 위한
기본적인 요소
웹 상에 존재하는 자원에 대한 정보와 자원들 사이의 관계를
기술하기 위한 프레임워크
RDF 기반 자원의 속성과 클래스의 구조를 기술하기 위한 용어집
RDF 기반의 질의 언어 및 프로토콜
웹에 존재하는 자원들을 식별하기 위해 사용되는 문자열
URI (Uniform Resource Identifier)
• 웹 상에서 사물(thing)을 식별하기 위한 식별자로 활용
식별하기 위해서
현실에서는 … 웹에서는 …
주민등록번호
861002-1052747
URI
http://semantics.kr/MyungjinLee
URI 생성 시 참고사항
• 단순성 – 짧고 기억하기 쉬운 형태로
• 안정성 – 가능한 오랫동안 유지될 수 있게
• 관리의 용이성 – 관리할 수 있는 형태로 만들도록
URI Type URI structure Examples
Identifier http://{domain}/id/{concept}/{reference} http://education.data.gov.uk/id/school/78
UK 공공 사례
'http://' BASE '/' 'id' '/' ORG '/' CATEGORY ( '/' TOKEN )+
미국정부 공공 사례
RDF (Resource Description Framework)
• 웹에 존재하는 자원에 대한 정보를 개념적으로 기술하거나 모델링하기 위한 방법을 제공
“이명진은 유라의 남편이다”를 RDF로 기술하면?
hasWife
http://semantics.kr/myungjinlee http://semantics.kr/yura http://semantics.kr/rel/hasWife
Subject
URI reference
Predicate
URI reference
Object
URI reference or Literal
Triple
RDF 예제
http://cafe.naver.com/yurasmarbling#me
유라
김아영
November 6, 1992
168
49
http://www.naver.com/GirlsDay/Yura.jpg
http://cafe.daum.net/Girlsday5#me
걸스데이
http://xmlns.com/foaf/0.1/nick
http://xmlns.com/foaf/0.1/name
http://xmlns.com/foaf/0.1/birthday
http://xmlns.com/foaf/0.1/height
http://xmlns.com/foaf/0.1/weight
http://xmlns.com/foaf/0.1/depiction
http://xmlns.com/foaf/0.1/member
http://xmlns.com/foaf/0.1/name
http://cafe.daum.net/Girlsday5
http://xmlns.com/foaf/0.1/homepage
RDF를 기계가 읽기 위한 방법
• RDF/XML – W3C Recommendation, 10 February 2004 – RDF 그래프 모형을 쓰고 교환하기 위해 사용되는 XML 기반의 문법
• N-Triples
– RDF Test Cases, W3C Recommendation, 10 February 2004 – RDF 데이터를 저장하고 전송하기 위한 평문(plain text) 형태의 포맷
• Notation 3 (N3)
– 사용자 가독성이 보다 확장된 형태로 RDF 모델을 직렬화(serialization)하기 위한 단축 표현
– RDF/XML보다 더 간결하고 가독성이 있는 형태
• Turtle (Terse RDF Triple Language)
– W3C Recommendation 25 February 2014 – RDF에서 데이터를 표현하기 위한 포맷
RDF를 기계가 읽기 위한 방법
<http://en.wikipedia.org/wiki/Tony_Benn> <http://purl.org/dc/elements/1.1/title> "Tony Benn" .
<http://en.wikipedia.org/wiki/Tony_Benn> <http://purl.org/dc/elements/1.1/publisher> "Wikipedia" .
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rdf:Description rdf:about="http://en.wikipedia.org/wiki/Tony_Benn">
<dc:title>Tony Benn</dc:title>
<dc:publisher>Wikipedia</dc:publisher>
</rdf:Description>
</rdf:RDF>
@prefix dc: <http://purl.org/dc/elements/1.1/>.
<http://en.wikipedia.org/wiki/Tony_Benn> dc:title "Tony Benn";
dc:publisher "Wikipedia".
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.org/stuff/1.0/> .
<http://www.w3.org/TR/rdf-syntax-grammar>
dc:title "RDF/XML Syntax Specification (Revised)" ;
ex:editor [ ex:fullname "Dave Beckett";
ex:homePage <http://purl.org/net/dajobe/>
] .
N-Triple
RDF/XML
N3
Turtle
RDFS(RDF Schema)
• RDF 형태의 데이터를 담기 위한 구조를 만드는 방법을 제공 – 클래스 정의
– 속성과 관련 제약조건에 대한 정의
– 계층 구조에 대한 정의
has wife
♂ ♀ is a is a
Male Female
Person
subset of subset of
RDF Schema 예제
car:Car
car:Vehicle
rdfs:subClassOf
rdf:Property
car:body_style rdfs:domain
rdfs:range
rdfs:Class
rdf:type
rdf:type
car:Style
rdf:type
car:A6
rdf:type
car:Sedan rdf:type car:body_style
RDF 데이터 구조에 대한 정의 부분
구조에 따른 RDF 데이터 부분
OWL (Web Ontology Language)
• 단순한 데이터의 구조를 벗어나 온톨로지를 만들기 위한 지식 표현 언어
Man Woman ∩ = Ø
Person Person descendant
Person descendant
descendant
Husband Wife 1:1
_01 Action hasGenre
ActionMovie
type
Genre
type
SPARQL (SPARQL Protocol and RDF Query Language)
• RDF 형식으로 저장된 데이터를 검색하고 조작하기 위한 언어 HTTP를 통한 SPARQL의 사용
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?email
WHERE {
?person a foaf:Person.
?person foaf:name ?name.
?person foaf:mbox ?email.
} RDF Storage
?name ?email
Myungjin Lee [email protected]
Gildong Hong [email protected]
t
Grace Byun [email protected]
SPARQL
HTTP
HTTP
LOD 에서의 역할들
응용서비스 개발
사용자 LOD서비스
구축 데이터 구축
모델링
변환
저장
발행
데이터 접근 서비스 접근
데이터 조회
LOD 데이터 구축자
데이터 구축자
모델링 도구
온톨로지 모델링
RDF
변환 규칙 작성
RDF 변환
데이터베이스
R2RML
RDFS & OWL
URI & RDF
RDF Serialization
LOD 데이터 구축자에게 필요한 도구
• 온톨로지 편집기 – 온톨로지 모델링 및 인스턴스 입력을 위한 도구
– 관련 도구
• Stanford Center for Biomedical Informatics Research의 Protege
• TopQuadrant의 TopBraid Composer
LOD 데이터 구축자에게 필요한 도구
• 변환기 – 데이터베이스의 관계형 데이터를 RDF 형태로 변환하기 위한 도구
– R2RML(RDB to RDF Mapping Language)를 기반으로 변환 수행
– 관련 도구
• LiST의 OntoTrans
• OpenLink Software의
Virtuoso RDF Views
LOD 서비스 구축자
LOD 서비스 제공자
RDF 적재
RDF
URI & RDF
RDF Serialization SPARQL
트리플 저장소
데이터 연계
LOD 서비스 프레임워크
LOD 서비스
Linked Data Platform
발행
LOD 서비스 구축자에게 필요한 도구
• 트리플 저장소 – RDF 형태의 데이터를 저장하고 운용 및 추론과 질의 처리를 수행 – 관련 도구 – LiST의 OntoBase
• 적용사례: KDATA, 주소데이터 LOD, 수목원 LOD, 국립중앙도서관 LOD 등
– OpenLink Software의 Virtuoso – Franz의 AllegroGraph – OntoText의 OWLIM
• LOD 발행 도구
– 구축된 RDF 데이터를 웹을 통해 발행하고 접근할 수 있도록 지원 – 관련 도구
• Pubby • OpenLink Software의 Virtuoso
LOD 사용자
LOD 서비스
응용서비스 개발자
응용서비스 개발자
URI
RDF
Query Result
SPARQL
URI & RDF SPARQL
SPARQL Query Result Format
LOD 사용자에게 필요한 도구
• 온톨로지 편집기 – LOD 사용자에게는 모델을 이해하기 위해 필요한 도구
• 프로그래밍 라이브러리 – RDF 형태의 데이터를 처리하기 위한 라이브러리
– 관련 도구
• Apache의 Jena
• University of Manchester의 OWL API
LOD 활용을 위한 절차
1. 활용하고자 하는 데이터 셋 검색
2. 온톨로지 모델 다운로드 및 이해
3. LOD 활용 – SPARQL을 이용하여 원하는 데이터 획득
– URI를 이용하여 데이터 조회
4. 응용 프로그램 개발
30 30
Dr. Myungjin Lee
e-Mail : [email protected] Twitter : http://twitter.com/MyungjinLee
Facebook : http://www.facebook.com/mjinlee SlideShare : http://www.slideshare.net/onlyjiny/
LOD 실습
Part 2. LOD 모델
2017-02-28
워크샵 프로그램
시간 제목 발표자
13:30~14:10 Part 1. LOD의 기본 개념 이명진
14:10~14:50 Part 2. LOD 모델 이명진
14:50~15:30 Part 3. SPARQL 이명진
15:30~15:50 Coffee Break
15:50~16:20 Part 4. 실습 – 모델의 이해 허홍수
16:20~17:00 Part 4. 실습 – SPARQL 허홍수
17:00~17:30 Part 4. 실습 – 프로그래밍 허홍수
LOD의 구조 이해하기
데이터베이스 온톨로지 객체지향 ≠ ≠
데이터베이스 온톨로지 객체지향 ≒ ≒
그러나 오늘만은,
LOD의 데이터 구조
• RDF(Resource Description Framework) 기반 – http://www.example.org/index.html has a creator whose
value is John Smith
– the subject(주어) is the URL http://www.example.org/index.html
– the predicate(동사) is the word "creator"
– the object(목적어) is the phrase "John Smith"
http://www.example.org/index.html
John Smith
creator
LOD의 데이터 구조
http://semantics.kr/myungjinlee http://semantics.kr/Yura http://semantics.kr/rel/hasWife
Subject
URI reference
Predicate
URI reference
Object
URI reference or Literal
Statement
데이터베이스(RDB)와 LOD의 데이터 구조
아이디 이름 나이 학과
MJLee 이명진 27 IE
학과 학과명
IE 정보산업공학과
데이터베이스
LOD
MJLee
이명진
27
IE 정보산업공학과
이름
학과
나이
학과명
URI의 사용
• 왜 URI를 사용하지? – 각각의 자원을 구별하기 위해서
– 중복된 이름이 없도록 하기 위해
– 웹에서 접근할 수 있도록 하기 위해서
– 접근했을 때 해당 자원에 대한 정보를 제공하기 위해서
데이터베이스(RDB)와 LOD의 데이터 구조
아이디 이름 나이 학과
MJLee 이명진 27 IE
학과 학과명
IE 정보산업공학과
데이터베이스
LOD
http://li-st.com/resourceMJLee
이명진
27
http://li-st.com/resourceIE
정보산업공학과
이름
학과
나이
학과명
클래스 (Class)
• 아주 간단히 무엇들의 집합
≒데이터베이스의 테이블
♂ Male Myungjin Lee
클래스 (Class)
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table
Person 클래스
sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
School 클래스
클래스 (Class)
Movie owl:Class rdf:type
rdf:type은 is-a 관계를 의미
즉, 해석하면 “Movie는 Class이다”
클래스의 상하위 관계
Person 클래스
Male 클래스
Female 클래스
Male 클래스
Female 클래스
Person 클래스
rdfs:subClassOf
rdfs:subClassOf
자원의 이름과 설명을 위한 속성
• rdfs:label – 자원에 대한 이름을 정의
• rdfs:comment – 자원에 대한 설명을 작성
rdfs:label Movie 영화
일정한 의미를 갖고 움직이는 대상을 촬영하여 영사기로
영사막에 재현하는 종합 예술 rdfs:comment
인스턴스 (Instance)
• 클래스를 구성하는 멤버 ≒ 데이터베이스의 행
rdf:type Male MyungjinLee
owl:Class
rdf:type
Male
• MyungjinLee
인스턴스 (Instance)
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
Person 클래스의 인스턴스
School 클래스의 인스턴스
속성(Property)
• 속성 – 둘 사이의 관계를 나타내기 위한 것
• 속성의 두 가지 유형 – 자원과 자원 사이의 관계: Object Property
– 자원과 값 사이의 관계: Datatype Property
has wife
age
30
Object Property
Datatype Property
데이터타입 속성 (Datatype Property)
• 자원과 값 사이의 관계 ≒데이터베이스의 일반 필드
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
Datatype Property
객체 속성 (Object Property)
• 자원과 자원 사이의 관계 ≒ 데이터베이스의 기본키와 외래키의 관계
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
Object Property
속성들이 가지고 있는 제약
• rdfs:domain – 속성을 가질 수 있는 클래스가 무엇인가?
• rdfs:range – 속성 값의 타입은 무엇인가?
Subject Predicate Object
has wife ? ?
domain: 주어를 위한
클래스는 머지?
range: 목적어를 위한 클래스는 머지?
속성들이 가지고 있는 제약
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
name 속성의 domain
name 속성의 range
affiliation 속성의 domain
affiliation 속성의 range
데이터타입 속성이 가질 수 있는 range
• XML Schema의 데이터 타입을 따름
Simple Type Examples
string Confirm this is electric
integer ...-1, 0, 1, ...
long -9223372036854775808, ... -1, 0, 1, ... 9223372036854775807
float -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN
date 1999-05-31
time 13:20:00.000, 13:20:00.000-05:00
boolean true, false, 1, 0
22 22
Dr. Myungjin Lee
e-Mail : [email protected] Twitter : http://twitter.com/MyungjinLee
Facebook : http://www.facebook.com/mjinlee SlideShare : http://www.slideshare.net/onlyjiny/
LOD 실습
Part 3. SPARQL
2017-02-28
워크샵 프로그램
시간 제목 발표자
13:30~14:10 Part 1. LOD의 기본 개념 이명진
14:10~14:50 Part 2. LOD 모델 이명진
14:50~15:30 Part 3. SPARQL 이명진
15:30~15:50 Coffee Break
15:50~16:20 Part 4. 실습 – 모델의 이해 허홍수
16:20~17:00 Part 4. 실습 – SPARQL 허홍수
17:00~17:30 Part 4. 실습 – 프로그래밍 허홍수
SPARQL
• SPARQL Protocol and RDF Query Language – SPARQL 위한 프로토콜에 대한 정의
– RDF 질의를 위한 질의 문법에 대한 정의
– W3C Recommendation 21 March 2013
– http://www.w3.org/TR/sparql11-query/
SPARQL의 구성
• SELECT – 질의 결과로 얻기 위한 변수를 지정
• FROM – 질의 대상이 되는 데이터 셋을 지정
• WHERE – 질의에 대응되는 조건 그래프 구조(트리플)를 작성
예제 데이터
rrn name affiliation
841002-1045617 Myungjin Lee 10
410203-3983612 Gildong Hong 20
841105-2056143 Grace Byun 10
Person Table
http://localhost:8890/test/MyungjinLee
841002-1045617
Myungjin Lee
Yonsei Univ.
http://localhost:8890/test/Yonsei
http://localhost:8890/test/rrn
http://localhost:8890/test/name
http://localhost:8890/test/sname
http://localhost:8890/test/affilication
sid sname
10 Yonsei Univ.
20 Seoul Univ.
School Table
http://localhost:8890/test 그래프
SPARQL의 구성
SELECT name FROM Person WHERE rrn = “841002-1045617”
SELECT ?y
FROM <http://localhost:8890/test>
WHERE {
?x <http://localhost:8890/rrn> “841002-1045617” .
?x <http://localhost:8890/name> ?y .
}
SQL
SPARQL
원하는 결과 질의 대상 질의 조건
SPARQL의 상세 구성
SELECT ?y
FROM <http://localhost:8890/test>
WHERE {
?x <http://localhost:8890/rrn> “841002-1045617” .
?x <http://localhost:8890/name> ?y .
}
SQL의 SELECT와 같이 특정 정보를 꺼내오기 위한 구문
그래프 구조이기 때문에 SQL과 달리 필드를 지정하는 것이 아니라 변수를 지정하여 해당 변수에 바인딩 된 결과를 획득하기 위해 변수를 지정
질의의 대상이 되는 그래프를 지정 (생략 가능. 생략할 경우 전체를 대상으로 조회)
지정된 그래프에서 결과를 추출
조건을 지정하기 위한 영역 선언
질의의 조건을 그래프의 트리플 구조에 따른 AND 형태로 기술
SELECT 절
• 질의 변수 지정하기 – "?" 표를 이용하여 변수임을 지정
– ?name, ?title, ?author
• 질의 결과는 테이블 형태를 가짐
SELECT ?title ?author
title author
Novel XML Myungjin Lee
Web Tim-Berners Lee
SPARQL
Query Results
Knowledge Base
WHERE 절
• WHERE 절 – 질의하고자 하는 조건을 트리플 단위로 기술
– 주어, 동사, 목적어는 공백으로 구분하며,
– 각각의 트리플은 "."로 구분
WHERE 절 예시
Data
<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "SPARQL Tutorial" .
Query
SELECT ?title
WHERE
{
<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title .
}
Query Result
title
“SPARQL Tutorial”
WHERE 절 예시
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Johnny Lee Outlaw" .
_:a foaf:mbox <mailto:[email protected]> .
_:b foaf:name "Peter Goodguy" .
_:b foaf:mbox <mailto:[email protected]> .
_:c foaf:mbox <mailto:[email protected]> .
Query
SELECT ?name ?mbox
WHERE
{ ?x <http://xmlns.com/foaf/0.1/name> ?name .
?x <http://xmlns.com/foaf/0.1/mbox> ?mbox }
Query Result
name mbox
“Johnny Lee Outlaw” <mailto:[email protected]>
“Peter Goodguy” <mailto:[email protected]>
WHERE 절에 작성된 트리플의 축약식
• 동사-목적어 축약식
?x foaf:name ?name ;
foaf:mbox ?mbox .
?x foaf:name ?name .
?x foaf:mbox ?mbox .
WHERE 절에 작성된 트리플의 축약식
• 목적어 축약식
?x foaf:nick "Alice" , "Alice_" .
?x foaf:nick "Alice" .
?x foaf:nick "Alice_" .
?x foaf:name ?name ; foaf:nick "Alice" , "Alice_" .
?x foaf:name ?name .
?x foaf:nick "Alice" .
?x foaf:nick "Alice_" .
PREFIX 키워드
• PREFIX 키워드 – URI에서 접두어를 선언하기 위한 키워드
– WHERE 절에 작성되는 URI를 축약하여 쓰기 위해 선언
PREFIX dc: <http://purl.org/dc/elements/purl.org/>
SELECT ?title
WHERE { <http://example.org/book/book> dc:title ?title }
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://example.org/book/>
SELECT ?title
WHERE { :book1 dc:title ?title }
값을 갖는 트리플에 대한 질의
@prefix dt: <http://example.org/datatype#> .
@prefix ns: <http://example.org/ns#> .
@prefix : <http://example.org/ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
:x ns:p "cat"@en .
:y ns:p "42"^^xsd:integer .
:z ns:p "abc"^^dt:specialDatatype .
• 언어 태그를 갖는 값 – @ 기호와 언어 태그를 사용하여 표현된 것들
• 데이터 타입을 갖는 값 – xsd:integer 데이터타입으로 지정된 값을 가지고 있는
것들
Query
SELECT ?v WHERE { ?v ?p "cat" }
Query Result
v
Query
SELECT ?v WHERE { ?v ?p 42 }
Query Result
v
<http://example.org/ns#y>
FILTER 키워드
• FILTER 키워드 – 특정 조건을 만족하는지를 검사하기 위한 방법
Data
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix : <http://example.org/book/> .
@prefix ns: <http://example.org/ns#> .
:book1 dc:title "SPARQL Tutorial" .
:book1 ns:price 42 .
:book2 dc:title "The Semantic Web" .
:book2 ns:price 23 .
FILTER 키워드
• 문자열 값에 대한 검사 – regex 함수
• 문자열에 대한 정규식 비교
• 숫자 값에 대한 검사
Query
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { ?x dc:title ?title
FILTER regex(?title, "^SPARQL")
}
Query Result
title
“SPARQL Tutorial”
Query
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX ns: <http://example.org/ns#>
SELECT ?title ?price
WHERE { ?x ns:price ?price .
FILTER (?price < 30.5)
?x dc:title ?title . }
Query Result
title price
“The Semantic Web” 23
정렬
• ORDER BY 절 – 결과에 대한 정렬
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
PREFIX : <http://example.org/ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY DESC(?emp)
결과의 중복 제거
• DISTINCT – 중복된 결과 제거
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:x foaf:name "Alice" .
_:x foaf:mbox <mailto:[email protected]> .
_:y foaf:name "Alice" .
_:y foaf:mbox <mailto:[email protected]> .
_:z foaf:name "Alice" .
_:z foaf:mbox <mailto:[email protected]> .
Query
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
Query Result name
“Alice”
OFFSET과 LIMIT
• LIMIT 절 – 출력될 결과의 최대 수를 지정
• OFFSET 절 – 출력될 결과의 시작 위치를 지정
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
LIMIT 5
OFFSET 10
SPARQL의 질의 유형
• SELECT – 지정된 변수에 바인딩 된 값을 추출하기 위한 질의
• CONSTRUCT – SELECT와 유사하지만 결과를 그래프 형태로 구성하고자 할 경우 사용하는 질의
• ASK – 지정된 조건을 만족하는지에 따라 true와 false를 반환하는 질의
• DESCRIBE – 지정된 URI에 대한 RDF 데이터를 포함하는 그래프를 얻고자 사용하는 질의
SELECT 유형
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Alice" .
_:a foaf:knows _:b .
_:a foaf:knows _:c .
_:b foaf:name "Bob" .
_:c foaf:name "Clare" .
_:c foaf:nick "CT" .
Query
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?nameX ?nameY ?nickY
WHERE
{ ?x foaf:knows ?y ;
foaf:name ?nameX .
?y foaf:name ?nameY .
OPTIONAL { ?y foaf:nick ?nickY }
}
Query Result nameX nameY nickY
“Alice” “Bob”
“Alice” “Clare” “CT”
CONSTRUCT 유형
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:[email protected]> .
Query
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
CONSTRUCT { <http://example.org/person#Alice> vcard:FN ?name }
WHERE { ?x foaf:name ?name }
Query Result
@prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> .
<http://example.org/person#Alice> vcard:FN "Alice" .
ASK 유형
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Alice" .
_:a foaf:homepage <http://work.example.org/alice/> .
_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:[email protected]> .
Query
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
ASK { ?x foaf:name "Alice" }
Query Result
yes
DESCRIBE 유형
Data
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:a foaf:name "Alice" .
_:a foaf:homepage <http://work.example.org/alice/> .
_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:[email protected]> .
Query
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
DESCRIBE ?x
WHERE { ?x foaf:mbox <mailto:[email protected]> }
Query Result
_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:[email protected]> .
26 26
Dr. Myungjin Lee
e-Mail : [email protected] Twitter : http://twitter.com/MyungjinLee
Facebook : http://www.facebook.com/mjinlee SlideShare : http://www.slideshare.net/onlyjiny/
LOD 실습
Part 4. 실습
허 홍 수
2017-02-28
워크샵 프로그램
시간 제목 발표자
13:30~14:10 Part 1. LOD의 기본 개념 이명진
14:10~14:50 Part 2. LOD 모델 이명진
14:50~15:30 Part 3. SPARQL 이명진
15:30~15:50 Coffee Break
15:50~16:20 Part 4. 실습 – 모델의 이해 허홍수
16:20~17:00 Part 4. 실습 – SPARQL 허홍수
17:00~17:30 Part 4. 실습 – 프로그래밍 허홍수
Chapter 1
LOD 모델
LOD 모델
• 왜 모델을 이해해야 하지?
• LOD 모델은 어디에서 얻을 수 있지?
• 획득한 모델은 어떻게 해석하지?
• 해석할 때 어떤 도구를 써야 하지?
• 모델을 획득하지 못할 경우에는?
데이터베이스와 LOD 모델
데이터베이스 Linked Open Data
LOD 모델 획득하기
제공
형태
파일
그래픽
그림
명세표
LOD 모델에 대한 실제 주소
• 국립중앙도서관 국가서지LOD (http://lod.nl.go.kr) – http://lod.nl.go.kr/spec/
• KDATA (http://kdata.kr) – http://kdata.kr/kdata/spec.jsp
• 생물정보LOD (http://lod.nature.go.kr/main/) – http://lod.nature.go.kr/main/intro/datadownload_list.jsp
• NDSL LOD (http://lod.ndsl.kr/) – http://lod.ndsl.kr/home/intro/ontology.jsp
• 스마트관광정보LOD (http://data.visitkorea.or.kr/) – http://data.visitkorea.or.kr/ontology/
LOD 모델 살펴보기 1
• Class, ObjectProperty, DatatypeProperty 구분하기 – Class : Resource들의 집합
– ObjectProperty : Resource와 다른 Resource간의 연결에 사용
– DatatypeProperty : Resource와 그 Resource가 가지는 Literal 값 연결에 사용
홍길동
임꺽정
이순신
유성룡 궁예
을지문덕 왕건 사람 유성룡 이순신
추천
1598
사망연도 ObjectProperty
DatatypeProperty
LOD 모델 살펴보기 2
• Class의 목록 파악 – Class의 종류에는 어떤 것들이 있는가?
– 주요한 Class는 무엇인가?
• Class의 계층(관계) 파악 – Class 간의 상·하위 계층은 어떻게 구성되어 있는가?
– 주요하게 살펴볼 Class는 어떤 외부 Class와 관계를 맺고 있는가?
LOD 모델 살펴보기 3
• Property의 목록 파악 – Property의 종류에는 어떤 것들이 있는가?
– ObjectProperty와 DatatypeProperty를 구분
• Property의 조건(관계) 파악 – Domain과 Range는 어떻게 되는가?
– Property에 어떠한 제약사항이 있는가?
그림/그래픽 표현의 이해 1
• Class – 대체적으로 원 또는 타원으로 표기함
– 원 안에 Class의 레이블을 표기
그림/그래픽 표현의 이해 2
• Property – 화살표가 있는 선으로 표기함
– 화살표가 있는 부분은 Range에 해당, 화살표가 없는 부분은 Domain에 해당
– 선 위에 해당 Property의 레이블을 표기
그림/그래픽 표현의 이해 3
• Literal – 네모 상자로 표기
그림/그래픽 표현의 이해 4
• Instance – 대체적으로 마름모 혹은 사각형과 원이 아닌 도형으로 표기
– Class 표기 안에 직접 Instance의 레이블을 넣는 경우도 있음
Chapter 2
TopBraid Composer를 이용한 모델 분석
LOD 모델 파일을 통한 분석
• LOD 모델 파일 – RDF/XML (xxx.rdf / xxx.owl)
– TTL (xxx.ttl)
– N-TRIPLE (xxx.nt)
• 활용 도구 – Text Editor (RDF를 읽을 수 있는 경우)
– 명세 생성 도구 (웹 환경에서 명세표를 생성하여 제공)
– 그래픽 뷰어 (웹 환경에서 모델을 그래픽으로 변경하여 제공)
– 온톨로지 모델링 도구
도구 활용 - TextEditor
• RDF로 표현된 LOD 모델 – RDF/XML 형태
– TTL 형태
– N-Triple 형태
<owl:Class rdf:about="http://lod.nl.go.kr/ontology/Library"> <rdfs:label xml:lang="en">Library</rdfs:label> <rdfs:label xml:lang="ko">도서관</rdfs:label> <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Organization"/> <rdfs:isDefinedBy rdf:resource="http://lod.nl.go.kr/ontology/"/> <vs:term_status>stable</vs:term_status> </owl:Class>
<http://lod.nl.go.kr/library/011001> a nlon:Library ; rdfs:label "국립중앙도서관" ; dct:subject nlk:KoreaLibraryMark .
<http://lod.nl.go.kr/resource/KSH00387796> <http://www.w3.org/2004/02/skos/core#closeMatch> <http://id.loc.gov/authorities/subjects/sh85134089> . <http://lod.nl.go.kr/resource/KSH00223343> <http://www.w3.org/2004/02/skos/core#closeMatch> <http://id.loc.gov/authorities/subjects/sh85082139> . <http://lod.nl.go.kr/resource/KSH00223343> <http://www.w3.org/2004/02/skos/core#closeMatch> <http://id.loc.gov/authorities/subjects/sh2002007922> . <http://lod.nl.go.kr/resource/KSH00416120> <http://www.w3.org/2004/02/skos/core#closeMatch> <http://id.loc.gov/authorities/subjects/sh85095839> .
도구 활용 - 명세 생성 도구
• OntoSpec – http://ontospec.com 에서 파일을 업로드하여 모델 명세를 확인할 수 있음
도구 활용 - 그래픽 뷰어
• WebVOWL – http://vowl.visualdataweb.org/ 에서 제공하는 그래픽 뷰어
도구 활용 - 온톨로지 모델링 도구
• TopBraid Composer – TopQuadrant 사에서 제작한 온톨로지 모델링 도구
– 모델파일을 읽어 직접 생성, 수정, 삭제를 할 수 있음
모델 분석 준비 (1/3)
• 프로젝트 생성 (1/2)
모델 분석 준비 (2/3)
• 프로젝트 생성 (2/2) – 프로젝트명 넣기
모델 분석 준비 (3/3)
• 파일 복사 – 분석 대상 파일을 복사하여 생성한 프로젝트에 붙여넣기
TBC의 구성
Class 영역 Property 영역
Project 영역
Form 영역
모델 분석 (1/9)
• Import한 모델 확인하기
①
②
모델 분석 (2/9)
• Namespace 확인
①
②
모델 분석 (3/9)
• Class 보기 토글
모델 분석 (4/9)
• Class 보기
국가서지LOD에서 정의한 Class들
Namespace에서 확인한 바와 같이 Base URI의 Prefix로 시작하는 Class들은 해당 모델에서 직접 정의하여 생성한 Class이다.
모델 분석 (5/9)
• Property 보기
ObjectProperties DatatypeProperties
모델 분석 (6/9)
• Property의 관계 파악
① ② Ctrl+좌클릭
모델 분석 (7/9)
• 해당 Class를 Domain으로 가지는 Property 찾기
모델 분석 (8/9)
• 해당 Class를 Range로 가지는 Property 찾기
모델 분석 (9/9)
• Form 영역에서 보기
Chapter 3
SPARQL 활용
TBC를 이용한 SPARQL 활용
• 모델을 획득하지 못했다면? – SPARQL을 통해 질의하여 확인 가능
(SPARQL Endpoint를 제공할 경우에만 가능)
• SPARQL 예제를 통한 모델 구조 파악하기
• 실제 LOD에 질의하여 데이터를 확인하기
• SPARQL Endpoint에서 질의하기
SPARQL 기본 문법
SELECT 찾을변수 WHERE { 조건식 }
SELECT ?s ?name WHERE { ?id rdf:type <http://lod.nl.go.kr/ontology/Author> . ?id foaf:name ?name . }
변수라는 것을 나타내는 ? 를 앞에 붙인다.
조건식은 S-P-O의 한 문장을 기본으로 한다. 조건식은 복수개가 가능하며 복수개일 경우
AND 조건으로 연결된다. 조건식의 구분은 문장 단위로 . 로 구분한다.
보다 자세한 내용은 http://lod.nl.go.kr/home/sparql/getting.jsp 에서 참고하세요
TBC에서의 SPARQL 사용
SPARQL 입력 부분
SPARQL 실행
SPARQL을 통한 모델 구조 파악 (1/13)
• Class 목록
SELECT * WHERE { ?s rdfs:subClassOf owl:Thing . }
owl:Thing 클래스의 하위 클래스들을 반환하시오
SPARQL을 통한 모델 구조 파악 (2/13)
• Class 전체 목록
SELECT * WHERE { ?s rdfs:subClassOf* owl:Thing . }
owl:Thing 클래스의 하위 클래스들과 그 클래스들의 하위 클래스들까지 모두 반환하시오
SPARQL을 통한 모델 구조 파악 (3/13)
• Class 목록과 레이블
SELECT * WHERE { ?s rdfs:subClassOf owl:Thing . ?s rdfs:label ?label . }
owl:Thing 클래스의 하위 클래스들과 그 클래스들의 label을 반환하시오
SPARQL을 통한 모델 구조 파악 (4/13)
• Class 상하위 관계
SELECT ?super ?s WHERE { ?s a owl:Class . ?s rdfs:subClassOf* owl:Thing . optional{ ?s rdfs:subClassOf ?super. filter(ISURI(?super)) } }
owl:Thing 클래스의 모든 하위 클래스들과 그 클래스들의 하위 클래스들을 반환하시오
SPARQL을 통한 모델 구조 파악 (5/13)
• 직접 정의한 Class 목록
SELECT ?s WHERE { ?s a owl:Class . filter(regex(str(?s), '^http://lod.nl.go.kr')) }
국가서지LOD에서 직접 정의한 클래스들을 반환하시오
SPARQL을 통한 모델 구조 파악 (6/13)
• Property 목록 - ObjectProperty
SELECT ?s WHERE { ?s a owl:ObjectProperty . }
ObjectProperty에 해당하는 프로퍼티들을 반환하시오
SPARQL을 통한 모델 구조 파악 (7/13)
• Property 목록 - DatatypeProperty
SELECT ?s WHERE { ?s a owl:DatatypeProperty . }
DatatypeProperty에 해당하는 프로퍼티들을 반환하시오
SPARQL을 통한 모델 구조 파악 (8/13)
• 직접 정의한 Property 목록
SELECT ?s WHERE { ?s a ?o . FILTER (?o = owl:ObjectProperty || ?o = owl:DatatypeProperty ) filter(regex(str(?s), '^http://lod.nl.go.kr')) }
국가서지LOD에서 직접 정의한 프로퍼티들을 반환하시오
SPARQL을 통한 모델 구조 파악 (9/13)
• 직접 정의한 Property의 domain과 range
SELECT * WHERE { ?s a ?o . FILTER (?o = owl:ObjectProperty || ?o = owl:DatatypeProperty ) filter(regex(str(?s), '^http://lod.nl.go.kr')) OPTIONAL { ?s rdfs:domain ?domain. } OPTIONAL { ?s rdfs:range ?range . } }
국가서지LOD에서 직접 정의한 프로퍼티들의 domain과 range를 반환하시오
SPARQL을 통한 모델 구조 파악 (10/13)
• Instance 목록
SELECT * WHERE { ?s a nlon:ContinuousDataType . }
ContinuousDataType 클래스에 속한 인스턴스를 반환하시오
SPARQL을 통한 모델 구조 파악 (11/13)
• 실제LOD에 질의하기 1
SELECT * WHERE { SERVICE <http://lod.nl.go.kr/sparql> { ?s a nlon:Author . } }
국가서지LOD의 SPARQL Endpoint에 저자 클래스의 인스턴스를 반환하시오
SPARQL을 통한 모델 구조 파악 (12/13)
• 실제LOD에 질의하기 2
SELECT * WHERE { SERVICE <http://lod.nl.go.kr/sparql> { ?s a nlon:Author . ?s foaf:name "윤동주" . } }
국가서지LOD의 SPARQL Endpoint에 저자 클래스의 인스턴스 중 이름이 윤동주인 저자를 반환하시오
SPARQL을 통한 모델 구조 파악 (13/13)
• 실제LOD에 질의하기 3
SELECT * WHERE { SERVICE <http://lod.nl.go.kr/sparql> { nlk:KAC201110203 owl:sameAs ?o . FILTER(regex(str(?o), '^http://data.kdata')) } SERVICE <http://kdata.kr/sparql> { ?o ?p ?kdata. } }
윤동주와 같은 개체로 식별된 KDATA의 윤동주가 제공하는 데이터를 반환하시오
Chapter 4
JENA를 이용한 LOD 활용
LOD에서 데이터 획득
• URI로 접근하여 데이터 획득
• 획득한 데이터를 Model에 담기
• 획득한 데이터에 SPARQL 질의
• 로컬파일에 대한 처리(다운로드 받은 데이터)
• 실제 SPARQL Endpoint에서 데이터 획득
• 결과를 JSON으로 변경
• 하나의 데이터셋 획득
• 두개의 데이터셋 획득
구동 환경
• Tool – Eclipse
• JAVA 환경 – JAVA1.8
• 필요한 라이브러리 – apache-jena-3.0.1
jena 3.x 버전부터는 java1.8 이상이 필요함
URI로 접근하여 데이터 획득
String uri = "http://lod.nl.go.kr/resource/KAC201110203"; try { URL url = new URL(uri); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), "UTF-8")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } }
http://lod.nl.go.kr/resource/KAC201110203
http://lod.nl.go.kr/data/KAC201110203?output=ttl
http://dbpedia.org/data/Yun_Dong-ju.json
자동으로 인식하여 RDF 데이터를 반환
TTL 형식으로 RDF 데이터를 반환
JSON 형식으로 RDF 데이터를 반환
관련 예제
- Ex01
- Ex01_1
- Ex01_2
획득한 데이터를 Model에 담기
String uri = "http://lod.nl.go.kr/resource/KAC201110203"; Model model = FileManager.get().loadModel(uri); model.write(System.out, "TTL"); StmtIterator iter = model.listStatements(ResourceFactory.createResource(uri), null, (RDFNode)null); Statement stmt = null; String sub = null, prop = null, obj = null; while(iter.hasNext()){ stmt = iter.next(); sub = stmt.getSubject().toString(); prop = stmt.getPredicate().toString(); obj = stmt.getObject().toString(); System.out.println(sub +"\t"+ prop +"\t"+ obj); }
관련 예제
- Ex02
- Ex03
- Ex03_1
Model 이라는 그릇에 담에 자신이 원하는 대로 조작할 수 있는 기반을 마련해 줄 수 있다.
획득한 데이터에 SPARQL 질의
String uri = "http://lod.nl.go.kr/resource/KAC201110203"; Model model = FileManager.get().loadModel(uri); String queryString = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE {?s foaf:name ?name}" ; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model); ResultSet rs = qexec.execSelect(); for (; rs.hasNext();) { QuerySolution rb = rs.nextSolution(); RDFNode x = rb.get("name"); if (x.isLiteral()) { Literal titleStr = (Literal) x; System.out.println(" " + titleStr); } else System.out.println("Strange - not a literal: " + x); }
관련 예제
- Ex04
Model 이라는 그릇에서 SPARQL 질의를 통해 원하는 데이터를 질의할 수 있다.
로컬파일에 대한 처리
String filename = "./doc/nlk_ontology.rdf"; Model model = FileManager.get().loadModel(filename); StmtIterator iter = model.listStatements(); Statement stmt = null; String sub = null, prop = null, obj = null; while(iter.hasNext()){ stmt = iter.next(); sub = stmt.getSubject().toString(); prop = stmt.getPredicate().toString(); obj = stmt.getObject().toString(); System.out.println(sub +"\t"+ prop +"\t"+ obj); }
관련 예제
- Ex05
- Ex06
- Ex06_1
- Ex06_2
내 로컬 컴퓨터에 다운로드 받은 온톨로지 모델파일이나 RDF 데이터가 있다면
이를 읽어 Model이라는 그릇에 담을 수 있다.
Model에 담긴 데이터는 앞장에서와 같이 SPARQL 질의를 해서 원하는 데이터를 획득할 수 있다.
실제 SPARQL Endpoint에서 데이터 획득
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * WHERE { SERVICE <http://lod.nl.go.kr/sparql> {?s a owl:ObjectProperty . } }" ; Query query = QueryFactory.create(queryString) ; try (QueryExecution qexec = QueryExecutionFactory.create(query, ModelFactory.createDefaultModel())) { ResultSet rs = qexec.execSelect() ; ResultSetFormatter.out(System.out, rs, query) ; }
관련 예제
- Ex07
- Ex08
실제 SPARQL Endpoint에 SPARQL 질의를 하여 데이터를 가져올 수 있다.
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * WHERE { ?s a owl:ObjectProperty . } " ; String service = "http://lod.nl.go.kr/sparql"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.sparqlService(service, query); ResultSet rs = qexec.execSelect();
결과를 JSON으로 변경
String queryString = "PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * WHERE { <http://lod.nl.go.kr/resource/KAC201110203> ?p ?o. } " ; String service = "http://lod.nl.go.kr/sparql"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.sparqlService(service, query); ResultSet rs = null; try { rs = qexec.execSelect(); } catch (Exception e) { e.printStackTrace(); } ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ResultSetFormatter.outputAsJSON(outputStream, rs); String json = new String(outputStream.toByteArray()); System.out.println( json);
관련 예제
- Ex09
SPARQL Endpoint에서 반환 받는 데이터를 JSON 형식으로 변경하여 가공할수 도 있다.
하나의 데이터셋 획득
String queryString = "DESCRIBE <http://lod.nl.go.kr/resource/KAC201110203> " ; String service = "http://lod.nl.go.kr/sparql"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.sparqlService(service, query); Model model = null; try { model = qexec.execDescribe(); } catch (Exception e) { e.printStackTrace(); } model.write(System.out, "TTL");
관련 예제
- Ex10
- Ex11
<http://lod.nl.go.kr/resource/KAC201110203> 이 URI를 따라가면 이 URI에 대한 데이터를 웹 상에
서 볼 수 있으며, DESCRIBE 라는 질의를 통해 이 URI에 대한 데이터를 가져올 수 있다.
두개의 데이터셋 획득
String queryString = "DESCRIBE <http://lod.nl.go.kr/resource/KAC201110203> " ; String service = "http://lod.nl.go.kr/sparql"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.sparqlService(service, query); model = qexec.execDescribe();
관련 예제
- Ex12
- Ex13
두 곳의 SPARQL Endpoint에서 데이터를 획득하여 하나의 Model에 담을 수 있다.
String queryString = "DESCRIBE <http://data.kdata.kr/resource/Yun_Dong-ju> " ; String service = "http://kdata.kr/sparql"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.sparqlService(service, query); model.add(qexec.execDescribe()); model.write(System.out, "TTL");
그림 출처
• http://lod.nl.go.kr/home/images/m_diagram_book.png
• http://vowl.visualdataweb.org/
• http://kdata.kr/model/
• http://ontospec.com/jsp/make/result.jsp?path=1421992005830kdata.rdf&lang=ko&fileName=kdata.rdf
• http://pro.europeana.eu/page/edm-documentation