在SPARQL中测试相同的一组值(双重否定)

时间:2019-07-01 20:28:42

标签: sparql rdf negation

在问答系统中,我需要比较用户回答的问题集以匹配与个人资料相关的问题集,以将用户归类到这些个人资料中。

我试图在单个查询中找到 元组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 :(得分:0)

毕竟,双重否定查询可以正常工作。