Python rdflib可传递查询

本教程将介绍Python rdflib可传递查询的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

Python rdflib可传递查询 教程 第1张

问题描述

我是使用rdflib的新手,我的问题也很简单。我有几个n-三元组文件,其中包含相当多的数据量,虽然每个文件在其主题中具有相同的域,但对象中的域对于每个文件是不同的。现在我想输入一个或多个文件,并将它们与数据集中的所有其他文件进行比较,以获得包含相同主题的三元组:

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

我的问题是,是否有更快、更简单的方法可以做同样的事情。

任何帮助都将不胜感激。

推荐答案

查看了更多的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) )
...

它要快得多。如果有人有一个更快的解决方案,我将非常感激,如果他们会张贴它。

好了关于Python rdflib可传递查询的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。