Hodustory/프로그래밍&DB

파이썬(python) 입문 : rdflib 패키지 1 (설치, rdf파일 읽어오기)

호두밥 2018. 4. 4. 13:54

안녕하세요!. 호두입니다.

오늘은 RDFlib 패키지를 소개해드리려 합니다. RDF는 S-V-O의 형태로 이루어진 db형태를 말하는데요. 자세한 내용은 다음에 가져올게요!


RDFLib은 RDF에서 작동하는 패키지 입니다. 다음과 같은 기능을 지원합니다.

  • RDF/XML, N3, NTriples, N-Quads, Turtle, Trix, RDFa, MicroData를 위한 파서와 직렬변환기
  • 다양한 스토어 중 하나에서 지원받는 Graph 인터페이스
  • 버클리 DB 위에 메모리 저장 및 영구 저장을 위한 저장 실행
  • SPARQL 1.1 지원

RDFLib 설치


RDFLib을 설치하는 가장 좋은 방법은 easy_install 이나 pip을 쓰는 것입니다.

$ easy_intall rdfilb

IRD 채널의 #rdflib나 rdflib-dev 구글그룹(커뮤니티)을 통한 지원도 다양합니다. RDFlib이 지원하는 가장 우선적인 인터페이스는 Graph입니다. 

RDFLib Graphs는 정렬된 저장소가 아닙니다. 그들은 임의의 순서로 트리플을 찾고 반환하는 기능을 제공하는 일반적인 SET의 형태입니다.

RDFLib Graphs는 특정한 파이썬 내장함수를 재정의합니다. 그들은 저장소의 타입을 판별하고 트리플로 구성된 set로서 가장 잘 생각하고 있습니다.


간단한 사용 예시 :

import rdflib
g = rdflib.Graph()
result = g.parse("http://www.w3.org/People/Berners-Lee/card")
print("graph has %s statemnets."% len(g))

for s, p,o in g :
if(s,p,o) not in g :
raise Exception("It better!")
s = g.serialize(format='n3')

print(s)

좀 더 확장된 사용 예시 :


from rdflib import Graph, Literal, BNode, Namespace, RDF, URIRef
from rdflib.namespace import DC, FOAF
g = Graph()
#donna라는 주어를 가진 개체의 식별자를 만들고, 관계어와 Data Properties를 정의해줍니다.
donna = BNode()
g.add((donna, RDF.type, FOAF.Person))
g.add((donna, FOAF.nick, Literal("donna", lang="foo")))
g.add((donna, FOAF.name, Literal("Donna Fales")))
g.add((donna, FOAF.mbox, URIRef("mailto:donna@dfd.com")))

#스토어에 있는 트리플을 해석해서 출력합니다.
print("--printing raw triples")
for s, p ,o in g:
print((s,p,o))
#타입이(클래스가) foaf:Person인 개체의 mbox를 출력합니다.
print("---printing mboxes")
for person in g.subjects(RDF.type, FOAF.Person):
for mbox in g.objects(person, FOAF.mbox) :
print(mbox)
#새로운 프리픽스, 네임스페티스의 짝으로 묶어서 읽을 수 있게 출력합니다.
g.bind("dc",DC)
g.bind("foaf", FOAF)
print(g.serialize(format='n3'))




NT 파일 읽어들이기


rdf 데이터는 xml, n3, ntriples, trix 등 다양한 형식을 가집니다. 가장 간단한 형태인 nTriples는 선형 방식입니다. 

파일 demo.nt를 아래의 두줄을 넣어서 만들어 보겠습니다. 코드를 복사해서 txt파일을 만든 후 확장자를 nt로 지정해주세요.


<http://bigasterisk.com/foaf.rdf#drewp> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .

<http://bigasterisk.com/foaf.rdf#drewp> <http://example.com/says> "Hello world" .

Parse()에서 키워드 매개변수를 format를 이용해서 불러오고 싶은 파일의 형식을 입력해줍니다. ( parse("demo.nt", format = "nt") )

파일의 포맷을 모른다면 rdflib.util.guess_format()을 이용하면 됩니다. 


import rdflib
from rdflib import Graph
g= Graph()
g.parse("demo.nt", format="nt")
print(g.serialize(format="n3"))

g2 = Graph()
g2_format = rdflib.util.guess_format("demo.nt")
g2.parse("demo.nt", format=g2_format)
print(g2.serialize(format="n3"))

NT파일에서 각각 개체의 속성을 보고 싶다면 아래의 코드를 추가하면 됩니다. 각 개체가 iri 속성일 경우 URIRef로, 문자열값(데이터 프로퍼티)일 경우 Literal로 출력됩니다.


import rdflib
from rdflib import Graph
g= Graph()
g.parse("demo.nt", format="nt")

import pprint
for st in g:

pprint.pprint(st) 

(rdflib.term.URIRef('http://bigasterisk.com/foaf.rdf#drewp'),

 rdflib.term.URIRef('http://example.com/says'),

 rdflib.term.Literal(u'Hello world'))

(rdflib.term.URIRef('http://bigasterisk.com/foaf.rdf#drewp'),

 rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),

 rdflib.term.URIRef('http://xmlns.com/foaf/0.1/Person'))


디렉토리에 있는 파일이 아닌 외부 웹상의 ㄱ에서 데이터를 읽어오려면, 아래와 같이 pasre()기능을 쓰면 됩니다.

이 포맷의 기본 값은 xml입니다. RDFLib는 또한 a.read 메소드를 이용해서도 간단하게 rdf 파일을 읽어들일 수 있습니다. 

g.parse("http://bigasterisk.com/foaf.rdf")
len(g)

-----------------------

음 웹상의 그래프 iri 주소에서 그냥 데이터를 불러오는 법도 알고 싶은데 여기서는 rdf 파일에서 불러오는 법만 말해주고 있네요.


반응형