2016-10-21 5 views
0

私はかなり新しいrdflibを使用しています。私の問題はやや単純です。私はいくつかのnトリプルファイルをかなりの量のデータが含まれていますが、各ファイルはそれぞれのファイルに同じドメインを持ちますが、オブジェクト内のドメインはファイルごとに異なります。今、私が入力1にしたい、またはそれ以上の、ファイルと同じ主題を含んでトリプル取得するには、データセット内の他のすべてのファイルとそれらを比較する:python rdflib推移的クエリ

[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)) 
... 

それはかなり速いです。もし誰かがより高速な解決策を持っていれば、投稿すれば大いに感謝します。

関連する問題