SPARQL-запрос для поиска объектов, похожих на объект - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть URI объекта (:P1), и я хочу найти все объекты, похожие на этот объект.Прямо сейчас я пытаюсь найти те сущности, которые связаны с :P1 через общую сущность и тот же атрибут.У меня такой запрос.

SELECT ?simP (SUM(?score) AS ?simScore) 
WHERE {
    {
        :P1 ?prop ?q.
        ?q ?propInv ?simP.
        ?propInv owl:inverseOf ?prop.
        FILTER(?simP != :P1).
        BIND(1 AS ?score).
    } UNION {
        :P1 ?prop1 ?q1.
        ?q1 ?prop2 ?q.
        ?q ?prop2Inv ?q2.
        ?q2 ?prop1Inv ?simP.
        ?prop1Inv owl:inverseOf ?prop1.
        ?prop2Inv owl:inverseOf ?prop2.
        FILTER(?simP != :P1).
        BIND(0.5 AS ?score).
    }
} 
GROUP BY ?simP
ORDER BY DESC(?simScore)

Как видите, я пытаюсь найти те объекты, которые связаны с P1 через общую сущность на расстоянии 1 прыжка, а затем 2 прыжка.Баллы (обратные числа прыжков) уменьшаются с увеличением количества прыжков.

Мои проблемы с этим запросом:

  • Требуется, чтобы каждое свойство имело обратное значение (owl:inverseOf), что не всегда должно иметь место.
  • количество утверждений в запросах продолжает увеличиваться по мере того, как я увеличиваю количество прыжков с 1 до 2 до 3 и т. д.

У меня вопрос: есть ли лучший способ получения результата?ожидая.Было бы замечательно, если бы запрос мог, по крайней мере, получить сущности, которые связаны с :P1 через общую сущность по крайней мере в 2 прыжках, без необходимости добавлять условие UNION для каждого прыжка.

Кроме того, существует ли лучший подход к тому, чтобы объекты считались "похожими" на :P1.

...