logo

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)
}
Previous
지식 그래프
Next
Cypher