RDF
RDF
RDF의 데이터 모델
- 자원(Resource): RDF에서 다루는 지식그래프의 대상
- 예: 사람, 장소, 사건, 웹페이지 등
- 각각의 자원은 URI (Uniform Resource Identifier)라는 주소를 가짐
- RDF 데이터는 세 부분으로 구성된 문장 또는 트리플(triple)의 집합으로 표현
- 주어 (Subject): 문장의 대상이 되는 자원
- 술어 (Predicate): 주어의 속성이나 주어와 목적어 간의 관계를 나타내는 자원
- 목적어 (Object): 속성의 값이나 관계의 대상. 자원이거나 리터럴
- 리터럴(Literal): 문자열, 숫자, 날짜 등 값
- 예: "홍길동", "42", "2024-05-30"
RDFLib
-
RDFLib는 파이썬(Python)으로 RDF 데이터를 다루기 위한 라이브러리
-
RDF를 이용한 본격적인 지식 그래프를 구축하려면 DBMS가 필요
-
간단한 개념 증명 목적의 개발을 할 때는 RDFLib를 사용할 수 있음
-
설치:
!pip install rdflib
- 임포트
import rdflib
그래프 생성
- 새로운 그래프
rg = rdflib.Graph()
- 새로운 자원
lily = rdflib.URIRef("http://example.org/person/Lily")
- 네임스페이스를 이용해서 새로운 자원 정의
PERSON = rdflib.Namespace("http://example.org/person/") # 네임스페이스 정의
rg.bind('ps', PERSON) # 저장할 때는 ps로 저장
lily = PERSON.Lily # 새로운 자원(위에서 정의한 것과 URI가 같음)
트리플 추가
- FOAF: RDF 등에서 인간관계를 나타내기 위한 체계
FOAF = rdflib.Namespace("http://xmlns.com/foaf/0.1/")
rg.bind("foaf", FOAF)
- 트리플 추가
rg.add((lily, rdflib.RDF.type, FOAF.Person)) # Lily는 사람
rg.add((lily, FOAF.knows, PERSON.James)) # Lily는 James를 안다
저장 및 불러오기
- 직렬화
print(rg.serialize())
- 저장
rg.serialize('example.ttl')
- 불러오기
rg = rdflib.Graph()
rg.parse('business.ttl')
내용 보기
- 모든 노드 보기
rg.all_nodes()
- 모든 트리플 보기
for s, p, o in rg:
sq = rg.qname(s) # URI를 짧게 줄임
pq = rg.qname(p)
oq = rg.qname(o) if isinstance(o, rdflib.URIRef) else f'"{o}"' # 리터럴은 따옴표
print(sq, pq, oq)
SPARQL
- SPARQL Protocol and RDF Query Language
- SQL과 비슷한 RDF를 위한 쿼리 언어
- 예: 고객을 모두 찾기
result = rg.query('''
SELECT ?customer ?name
WHERE {
?customer a ex:Customer .
?customer foaf:name ?name .
}
''')
- 결과 출력:
for row in result:
print(row.customer, row.name)
Alice가 구입한 제품의 이름
SELECT ?product ?productName
WHERE {
ex:Alice ex:bought ?product .
?product rdfs:label ?productName .
}
Alice가 구입한 제품이 속한 카테고리의 이름
SELECT ?product ?productName ?category ?categoryName
WHERE {
ex:Alice ex:bought ?product .
?product rdfs:label ?productName .
?product ex:belongsTo ?category .
?category rdfs:label ?categoryName .
}
가격이 300 이상인 제품을 구입한 고객
SELECT ?customer ?productName ?price
WHERE {
?customer a ex:Customer .
?customer foaf:name ?customerName .
?customer ex:bought ?product .
?product rdfs:label ?productName .
?product ex:price ?price .
FILTER (?price >= 300)
}