以下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 不同的情况下获取结果,并且无法找到相关文档。
答案 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