2016-10-21 14 views
0

나는 rdflib을 사용하여 상당히 새로운 편이며 내 문제는 오히려 간단합니다. 나는 각자 파일에 동일한 도메인을 가지고있는 반면, 상당히 사려 깊은 양의 데이터를 담고있는 여러 개의 n-triple 파일을 가지고있다. 객체의 도메인은 각 파일마다 다르다. 지금은 입력 하나 이상의 파일을 원하는 동일한 주제에 포함 된 트리플 얻을 수있는 데이터 세트의 다른 모든 파일과 비교 :python rdflib transitive query

[selected file] 
a owl:sameAs b 

[other files] 
a owl:sameAs c 
a owl:sameAs d 

가 출력 될해야 :

b owl:sameAs c 
b owl:sameAs d 

현재의 접근 방식은 매우 순진하며 선택한 파일의 모든 트리플을 반복하면서 동일한 주제와 술어가 포함되어 있으면 다른 모든 트리플을 검사하므로 너무 오래 걸립니다.

... 
for mainGraph in mainGraphs: 
    for s,p,o in mainGraph: 
     for graph in graphs: 
      for s1,p1,o1 in graph: 
       if s == s1 and p == p1: 
        backlinks.add((o, OWL.sameAs, o1)) 
... 

내가 중 하나가 작동하지 않은 SPARQL 쿼리를 삽입하려고 : 같은 일을 할 것 빠르고 간단한 방법이 있는지

... 
for mainGraph in mainGraphs: 
    for graph in graphs: 
     union = mainGraph + graph 
     qres = union.query(
     """SELECT DISTINCT ?x ?y 
      WHERE 
      { 
       ?x owl:sameAs+ ?y . 
      }""") 
... 

내 질문입니다.

도움을 주시면 감사하겠습니다.

+0

모두'(s p o)'대신에 두 파일의'(s owl : sameAs o)'트리플 만 선택하면 안 되는가? 아니면'owl : sameAs' 데이터 샘플이 그 예입니까? – AKSW

+0

다른 조건자를 포함 할 수있는 트리플이있을 수 있으므로 owl : samAs 데이터 집합의 무결성을 보장하기위한 추가 검사입니다. –

답변

1

나는 다음과 같은 해결책을 알아 냈 rdflib 문서의 자세한 내용을 확인한 후 :

... 
for mainGraph in mainGraphs: 
    for s,p,o in mainGraph.triples((None, OWL.sameAs, None)): 
     for graph in graphs: 
      for s1,p1,o1 in graph.triples((s,p,None)): 
       backlinks.add((o1, OWL.sameAs, o)) 
... 

이 상당히 빠릅니다. 누군가가 더 빠른 해결책을 가지고 있다면 나는 그것을 게시한다면 크게 감사 할 것입니다.