使用rdflib检索不同的值

时间:2015-06-01 14:24:22

标签: python sparql rdflib

以下python代码是较大部分的一部分(其他一切正常):

import rdflib

g1 = rdflib.Graph()
g1.parse("existing_graph.nt", format="nt")

q = "select ?ent_a ?ent_b where { ?ent_a <http://www.example.org/rel> ?c . " \
    "?ent_b <http://www.example.org/rel> ?c. }"
res = g1.query(q)

我希望仅在 ent_a ent_b 不同的情况下获取结果,并且无法找到相关文档。

3 个答案:

答案 0 :(得分:2)

您将获得与?a ?b的每个不同的FILTER !=对,但也会?b ?a(对方反转)

如果?a?b是URI,则此模式可能有所帮助:

select *
where {
    ?a a ?s.
    ?b a ?s.
filter (str(?a) > str(?b))
} 

答案 1 :(得分:1)

最简单的方法就是说两件事情不一样,就是使用!=符号。

select distinct *
where {
    ?a a ?s.
    ?b a ?s.
filter (?a!=?b)
} 

然而,这个查询非常奇怪,因为只写了:

select distinct *
where {
    ?a ?p ?s.
} 

您可以提取与?a具有?p关系的每个不同的?s。因此,根据您的使用情况,您已经生成了结果集。

如果您需要深入挖掘,请根据您的评论:

  

我有一个本体论类型&#34;团队&#34;有一个&#34;位于&#34;与他们的家乡&#34;的关系,我希望找到所有可能的当地德比。

您需要添加与第一个肚子相关的另一个三重奏来添加更多限制。例如,在dbpedia中,以下查询将为您提供所有团队及其理由:

select distinct *
where{
    ?o a dbpedia-owl:SportsTeam.
    ?o dbpedia-owl:ground ?ground.
}

答案 2 :(得分:0)

为什么在将整个图形加载到内存中时会运行缓慢的SPARQL查询?您可以以任何您想要的方式遍历tripples并比较等同性等。  http://rdflib.readthedocs.org/en/latest/intro_to_graphs.html#basic-triple-matching