使用 rdflib 检索不同的值

Retrieving distinct values with 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[=18 的情况=] 找不到相关文档。

仅表示两个事物不同的最简单方法是使用 != 符号。

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

然而,这个查询很奇怪,因为只写:

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

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

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

I have an ontology where objects of type "teams" have a "locatedIn" relationship with their "hometown", and I wish to find all of the possible local derbies.

您需要通过添加与第一个 tripe 相关的另一个 tripe 来添加更多限制。例如,在 dbpedia 中,以下查询将为您提供所有球队及其场地:

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

你会得到每一个不同的 ?a ?bFILTER !=,还有 ?b ?a(相反的对)

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

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

当您已经将整个图加载到内存中时,为什么 运行 SPARQL 查询变慢?您可以以任何您想要的方式循环三元组并比较相等性等。 http://rdflib.readthedocs.org/en/latest/intro_to_graphs.html#basic-triple-matching