2016-10-21 2 views
0

Я довольно новичок в использовании rdflib, и моя проблема довольно проста. У меня есть несколько n-тройных файлов, содержащих довольно внимательное количество данных, в то время как каждый файл имеет тот же домен в своем предмете, домен в объекте отличается для каждого файла. Теперь я хочу, чтобы ввести один или более, файлы и сравнить их с любым другим файлом в наборе данных, чтобы получить тройки, которые содержат один и тот же предмет: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 owl: sameAs o)' тройки из обоих файлов вместо всех '(s p 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)) 
... 

Это значительно быстрее. Если у кого-то есть более быстрое решение, я был бы очень признателен, если бы он опубликовал его.

Смежные вопросы