У меня есть 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
.