python rdflib传递查询

时间:2016-10-21 17:17:33

标签: python sparql python-3.5 rdflib

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

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

在检查了更多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) )
...

它快得多。如果某人有更快的解决方案,我会非常感激,如果他们发布它。