Тестирование на идентичные наборы значений в SPARQL (двойное отрицание) - PullRequest
1 голос
/ 01 июля 2019

В системах ответов на вопросы мне нужно сравнить набор вопросов, на которые пользователи ответили, чтобы сопоставить наборы вопросов, связанных с профилями, чтобы сгруппировать пользователей в этих профилях.

Я пытаюсь найти, в одном запросе , кортежи 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, последний выпуск).

Спасибо

1 Ответ

0 голосов
/ 03 июля 2019

В конце концов, запрос с двойным отрицанием прекрасно работает .

...