与SPARQL成对比较

时间:2017-05-23 15:15:13

标签: sparql linked-data

我想针对给定的相似性度量比较成对的对象集合。该度量标准将被明确定义,使得某些属性完全匹配,而其他属性只能彼此如此不同(即,比较浮点数:它们之间不超过50%SMAPE)。

我如何构建这样的查询?理想情况下,输出是Nx2表,其中每行包含两个可比较对象的IRI。重复(即1 == 2是匹配以及2 == 1)是可以接受的,但如果我们可以避免它们那么好。

我想通过一个查询在所有对上运行它。我可能能够弄清楚如何为给定的对象做这件事,但是当同时查询所有对象时,这个问题变得更加困难。

有没有人对如何执行此操作有深入了解?

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 GaborMagda Gabor可能是同一个人 两人都是George Sanders的配偶,他们的wikiPageID彼此并没有太大差异。

一些解释:

  • ?subject1 > ?subject2子句删除“permutation duplicatelicates”;
  • 关于xsd:float的使用情况,请参阅this question