Hodustory/프로그래밍&DB

파이썬(python) 입문 : rdflib 패키지 3 (Graphs 다루기)

호두밥 2018. 4. 5. 01:09

Graphs 다루기


RDF Graph는 RDF 트리플의 한 세트를 말합니다. RDFLib에서 정확하게 미러링하려고 시도하고 그래프는 컨테이너 유형을 모방하려고 시도합니다. 


반복자로서의 그래프(Graphs as lterators)


RDFLib Graphs는 내부의 트리플에 대한 반복을 지원하는 순서에 따라 __iter__()로 덧씌워집니다. 

for subject, predicate, obj in someGraph:
if not (subject, predicate, obj) in someGraph :
raise Exception("Iterator/container protocols are Broken!!")

존재 확인(Contains Check)


Graph에서 __contains__()를 실행하면, 그래프에 트리플이 있는지를 확인할 수 있습니다.

from rdflib import URIRef
from rdflib.namespace import RDF
bob = URIRef("http://example.org/people/bob")
if ( bob, RDF.type, FOAF.Person ) in graph:
print "This graph knows that Bob is a person!"

이 트리플들은 완벽하게 바운드될 필요는 없습니다.

if (bob, None, None) in graph:
print "This graph contains triples about Bob!"

RDF Graphs에서 SET 기능 (Ser Operations on RDFLib Graphs)


Graphs는 몇개의 파이썬 연산자에 덧씌워집니다. (__iadd__(), __isub__() 등 ) 이것은 더하기, 빼기, 그외 다른 그래프의  set 기능을 지원합니다.

 

operationeffect
G1 + G2

합집합으로 새로운 그래프

G1 += G1

합집합이나, 더하기로 그래프 대체하기

G1 - G2

차집합으로 새로운 그래프

G1 -= G2

차집합으로 그래프 대체하기

G1 & G2

교집합

G1 ^ G2

xor 대칭차집합(합집합-교집합)


기본 Triple 매칭


모든 트리플들을 반복하는 대신에, RDFLib graphs 들은 triples() 함수를 이용해 기본 트리플 패턴 매칭을 지원합니다. 이 함수는 인수로 주어든 패턴에 매칭되는 트리플을 발생시킵니다. 이 인수들은 반환되는 트리플을 제한하는 RDF 용어입니다. None은 와일드카드로 이용됩니다.

g.load("some_foaf.rdf")
for s,p,o in g.triples( (None, RDF.type, FOAF.Person) ):
print ("%s is a person"%s)

for s,p,o in g.triples( (None, RDF.type, None) ):
print ("%s is a %s"%(s,o))

bobgraph = Graph()

bobgraph += g.triples( (bob, None, None) )

만약에 당신이 전체 트리플에 관심이 없다면 object(), subjects(), predicates(), predicates_objects() 등을 이용해 원하는 부분만 가져올 수도 있습니다. 각각은 제약조건에 대한 트리플 구성요소에 대한 매개변수를 가집니다.

for person in g.subjects(RDF.type, FOAF.Person):
print "%s is a person"%person

결국 어떤 속성에 대해, 리소스 당 하나의 값이 있는 경우 이용할 수 있고, 또는 최대 튜플의 갯수를 가집니다. 그 value() 메소드는 이것을 위해 사용되며, 값은 하나의 노드로 반환됩니다.

name = g.value(bob, FOAF.name)  # get any name of bob
# get the one person that knows bob and raise an exception if more are found
mbox = g.value(predicate=FOAF.name, object=bob, any=False)

트리플에 접근하기 위한 Graph 메소드


그래프에 쿼리하기 위한 간편한 메소드들이 있습니다.


  • Graph.lable() : 노드의 라벨값을 반환합니다. 
  • Graph.preferredLable() : SKOS에서 제공하는 대표이름 관계를 가진 preferredLable 값을 반환합니다.
  • Graph.triples() : 트리플 스토어를 발생시켜, 입력된 패턴에 맞는 트리플을 모두 반환합니다. 
  • Graph.value() : 두쌍의 인수로 이루어지며, 보통은 subject와 predicate(서술/관계)가 명시되고, object에 None이 입력됩니다. 
  • Graph.subjects(predicate=None, object=None) : 주어진 조건에 대한 subject를 반환합니다.
  • Graph.objects(subject=None, predicate=None) : 주어진 조건에 대한 object를 반환합니다.
  • Graph.predicates(subject=None, object=None) : 주어진 조건에 대한 predicates를 반환합니다.
  • Graph.subject_objects(predicate=None) : 주어진 predicate를 가진 subject와 object를 반환합니다.
  • Graph.subject_predicates(object=None) : 주어진 object를 가진 subject와 predicate를 반환합니다.
  • Graph.predicate_objects(subject=None) : 주어진 subject를 가진 predicate와 object를 반환합니다.

----------------------
음 그래프 매소드를 배웠습니다. SPARQL에서 다 할 수 있는 것들을 메소드로 제공하네요. 다음 편이 SPARQL이던데 어떤 차이가 있을지 궁금합니다. 


반응형