我想针对给定的相似性度量比较成对的对象集合。该度量标准将被明确定义,使得某些属性完全匹配,而其他属性只能彼此如此不同(即,比较浮点数:它们之间不超过50%SMAPE)。
我如何构建这样的查询?理想情况下,输出是Nx2表,其中每行包含两个可比较对象的IRI。重复(即1 == 2是匹配以及2 == 1)是可以接受的,但如果我们可以避免它们那么好。
我想通过一个查询在所有对上运行它。我可能能够弄清楚如何为给定的对象做这件事,但是当同时查询所有对象时,这个问题变得更加困难。
有没有人对如何执行此操作有深入了解?
答案 0 :(得分:1)
这个想法是这样的:
PREFIX ex: <http://example.org/ex#>
SELECT DISTINCT ?subject1 ?subject2
WHERE {
?subject1 ex:belongs ex:commonCategory .
?subject2 ex:belongs ex:commonCategory .
?subject1 ex:exactProperty ?e .
?subject2 ex:exactProperty ?e .
?subject1 ex:approxProperty ?a1 .
?subject2 ex:approxProperty ?a2 .
FILTER ( ?subject1 > ?subject2 ) .
FILTER ( (abs(?a1-?a2)/(abs(?a1)+abs(?a2))) < 0.5 )
}
例如,在DBpedia上:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX umbel-rc: <http://umbel.org/umbel/rc/>
SELECT DISTINCT ?subject1 ?subject2
WHERE {
?subject1 rdf:type umbel-rc:Actor .
?subject2 rdf:type umbel-rc:Actor .
?subject1 dbo:spouse ?spouse1 .
?subject2 dbo:spouse ?spouse2 .
?subject1 dbo:wikiPageID ?ID1 .
?subject2 dbo:wikiPageID ?ID2 .
FILTER ( ?subject1 > ?subject2 ) .
FILTER ( ?spouse1 = ?spouse2 ) .
FILTER ( abs(?ID1-?ID2)/xsd:float(?ID1+?ID2) < 0.05 )
}
因此,Zsa Zsa Gabor和Magda Gabor可能是同一个人
两人都是George Sanders的配偶,他们的wikiPageID
彼此并没有太大差异。
一些解释:
?subject1 > ?subject2
子句删除“permutation duplicatelicates”; xsd:float
的使用情况,请参阅this question。