在问答系统中,我需要比较用户回答的问题集以匹配与个人资料相关的问题集,以将用户归类到这些个人资料中。
我试图在单个查询中找到 元组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工作。)
谢谢
答案 0 :(得分:0)
毕竟,双重否定查询可以正常工作。