В системах ответов на вопросы мне нужно сравнить набор вопросов, на которые пользователи ответили, чтобы сопоставить наборы вопросов, связанных с профилями, чтобы сгруппировать пользователей в этих профилях.
Я пытаюсь найти, в одном запросе , кортежи profile;user
, где пользователь ответил на все вопросы, связанные с профилем, которые я склонен интерпретировать как . ситуация, когда пользователь не отвечает на вопрос профиля (двойное отрицание).
Вот набор данных, для которого ожидаемый ответ :profile1 :Alice
:
@prefix : <http://example/> .
# Alise has answered 2 questions
:alice a :User .
:alice :hasAnswer :a1, :a2 .
:a1 :question :q1 .
:a2 :question :q2 .
# Bob answered only q1
:bob a :User .
:bob :hasAnswer :b1 .
:b1 :question :q1 .
# Carl did not answered anything
:carl a :User .
# Profile 1 is associated to q1 and q2
:profile1 a :Profile .
:profile1 :associatedQuestion :q1, :q2 .
# Profile 2 is associated to q1 and q3
:profile2 a :Profile .
:profile2 :associatedQuestion :q1, :q3 .
Это не работает:
PREFIX : <http://example/>
SELECT ?user ?profile
WHERE {
?user a :User .
?profile a :Profile .
FILTER NOT EXISTS {
?profile :associatedQuestion ?q .
FILTER NOT EXISTS {
?user :hasAnswer ?a .
?a :question ?q .
}
}
}
Я пытался играть с MINUS вместо FILTER NOT EXISTS, меняя имена переменных и т. Д.
Я пытался использовать другой способ, выбирая пользователей, которые ответили на то же количество вопросов, что и в профиле, но это кажется излишним, и у меня есть сомнения по поводу производительности:
PREFIX : <http://example/>
SELECT ?profile ?numberOfQuestions ?user (COUNT(?a) AS ?numberOfAnswers)
WHERE {
?profile a :Profile .
?profile :associatedQuestion ?question .
OPTIONAL {
?user :hasAnswer ?a .
?a :question ?question .
}
{
SELECT ?profile (COUNT(?question) AS ?numberOfQuestions)
WHERE {
?profile a :Profile .
?profile :associatedQuestion ?question .
}
GROUP BY ?profile
}
}
GROUP BY ?profile ?numberOfQuestions ?user
HAVING (?numberOfAnswers = ?numberOfQuestions)
Есть ли способ достичь желаемого результата с помощью двойного отрицания? какой шаблон запроса даст лучшую производительность? (Я работаю в Jena Fuseki, последний выпуск).
Спасибо