Попарное сравнение со SPARQL

Я хотел бы сравнить набор объектов попарно для заданной метрики сходства. Метрика будет определена явно, так что некоторые свойства точно совпадают, а некоторые другие могут отличаться друг от друга лишь незначительно (т. е. сравнение чисел с плавающей запятой: не более 50% /wiki/Symmetric_mean_absolute_percentage_error" rel="nofollow noreferrer">SMAPE между ними).

Как мне построить такой запрос? В идеале на выходе должна быть таблица Nx2, где каждая строка содержит два IRI для сопоставимых объектов. Дубликаты (т. е. 1 == 2 — это такое же совпадение, как и 2 == 1) допустимы, но если мы сможем их избежать, это тоже будет здорово.

Я хотел бы запустить это на всех парах с одним запросом. Я, вероятно, смог бы понять, как это сделать для данного объекта, но при одновременном запросе по всем объектам эта проблема становится намного сложнее.

Кто-нибудь знает, как это сделать?


person Lukas    schedule 23.05.2017    source источник
comment
SMAPE не симметричен...   -  person Stanislav Kralin    schedule 23.05.2017
comment
@StanislavKralin Прости? Это. Это прямо в названии (и определении). Он определенно симметричен.   -  person Lukas    schedule 23.05.2017
comment
Да, ты прав, извини!   -  person Stanislav Kralin    schedule 23.05.2017


Ответы (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 и Магда Габор — одно и то же лицо.
Оба были супругами Джордж Сандерс и их wikiPageID не сильно отличаются друг от друга.

Некоторые пояснения:

  • Предложение ?subject1 > ?subject2 удаляет «дубликаты перестановок»;
  • Об использовании xsd:float см. этот вопрос.
person Stanislav Kralin    schedule 23.05.2017