这是我的数据
@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
:user1 :hasFirstName "user1First".
:user1 :hasLastName "user2Last".
:user1 :hasMobileNumber "013434334".
:user2 :hasFirstName "ania".
:user2 :hasLastName "ania".
这是我的询问(让没有电话号码的所有人)
PREFIX : <http://example.org/rs#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?firstName ?lastName ?mobileNumber
{
?user :hasFirstName ?firstName.
?user :hasLastName ?lastName.
minus {?user :hasMobileNumber ?mobileNumber}
}
它非常好用。但是,我添加了一个这样的可选项:
PREFIX : <http://example.org/rs#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?firstName ?lastName ?mobileNumber
{
?user :hasFirstName ?firstName.
?user :hasLastName ?lastName.
optional {?user :hasMobileNumber ?mobileNumber}
minus {?user :hasMobileNumber ?mobileNumber}
}
reuslt变为空,虽然它只是可选的,并且可选的不会影响查询的结果,因为两个用户都是结果(有和没有可选)
为什么会发生这种情况?
答案 0 :(得分:3)
如果您查看文档,可以说明 minus 的作用,甚至是一个示例。
8.2 Removing Possible Solutions
SPARQL中提供的另一种否定风格是MINUS 评估它的两个参数,然后计算解决方案 左侧与解决方案不兼容 右手边。
在您的情况下,左侧,一旦您添加了可选, 总是具有?user 的绑定,有时候绑定?mobileNumber 。 可选的结果,但没有减号,结果如下:
------------------------------------------------------
| user | firstName | lastName | mobileNumber |
======================================================
| :user1 | "user1First" | "user2Last" | "013434334" |
| :user2 | "ania" | "ania" | |
------------------------------------------------------
现在,当减号和可选都存在时,您将得不到任何结果。我假设您了解为什么 user1 被排除在外。但为什么 user2 被排除?
“左手”部分包括绑定
------------------------------------------------------
| user | firstName | lastName | mobileNumber |
======================================================
| :user2 | "ania" | "ania" | |
------------------------------------------------------
右手部分(减号中的部分)没有任何匹配项。这意味着所有左侧部分中的解决方案与兼容。这意味着,当你得到
左侧的解决方案与之不兼容 解决方案在右侧。
你得到 nothing ,因为左侧的所有解决方案都与右侧的解决方案“不兼容”。