Sparql 为什么可选绑定不起作用
这是一个关于为什么我的代码不工作的问题,不是关于如何做某事的问题,这就是为什么我没有向您提供数据,但如果您愿意,我可以提供给您,但数据将是我相对较小的本体 这是我的密码Sparql 为什么可选绑定不起作用,sparql,rdf,semantic-web,owl,ontology,Sparql,Rdf,Semantic Web,Owl,Ontology,这是一个关于为什么我的代码不工作的问题,不是关于如何做某事的问题,这就是为什么我没有向您提供数据,但如果您愿意,我可以提供给您,但数据将是我相对较小的本体 这是我的密码 OPTIONAL { VALUES ?user { rs:ania } ?userContext rdf:type rs:UserContext ; rs:appliedOnItems ?itemClass ;
OPTIONAL
{
VALUES ?user { rs:ania }
?userContext rdf:type rs:UserContext ;
rs:appliedOnItems ?itemClass ;
rs:appliedOnUsers ?userClass .
?item rdf:type ?itemClass .
OPTIONAL
{ ?userContext rs:hasWeightIfContextMatched ?weightMatched }
OPTIONAL
{ ?userContext rs:hasWeightIfContextDoesNotMatch ?weightNotMatched }
OPTIONAL
{ ?userContext rs:doNotRecommendInCaseNotMatch true
BIND(1 AS ?skip_)
}
bind(if (bound(?skip_) && (not EXISTS {?user a ?userClass}) , ?skip_, 0) as ?skip1)
values (?defaultUserMatched ?defaultUserNotMatched) {(1 0.5)}
BIND(if(EXISTS { ?user rdf:type ?userClass }, coalesce(?weightMatched, ?defaultUserMatched), coalesce(?weightNotMatched, ?defaultUserNotMatched)) AS ?weight)
}
values ?defaultNoUserContext {1}
BIND(if(bound(?skip1), ?skip1, 0) as ?skip)
BIND(if(bound(?weight), ?weight, ?defaultNoUserContext) AS ?userContextWeight)
}
这段代码只是我实际查询中的一个块,还有另一个块带来了?item
变量
如您所见,我的代码有?item rdf:type?itemClass
,但是?item
的一个绑定不是来自?itemClass
的类型,因此整个可选项将不会执行(对于该绑定),因此当我们退出可选项时,会出现这一行
BIND(if(bound(?weight), ?weight, ?defaultNoUserContext) AS ?userContextWeight)
if
部分将给出false
,因此?userContextWeight
应绑定到?defaultNoUserContext
。但是,我的代码不会为这些项生成任何内容(任何值)。你知道为什么吗
再次,如果你需要数据,我非常欢迎给你,谢谢
更新
现在我明白了,我想要的是:
即使该项不属于?itemClass
,我也需要为?userContextWeight
提供一个默认值
看看更新
OPTIONAL
{
VALUES ?user { rs:ania }
?userContext rdf:type rs:UserContext ;
rs:appliedOnItems ?itemClass ;
rs:appliedOnUsers ?userClass .
bind (if ( exists {?item rdf:type ?itemClass .}, true , false) as ?doesItemBelongToUserContextItemClass)
OPTIONAL
{ ?userContext rs:hasWeightIfContextMatched ?weightMatched }
OPTIONAL
{ ?userContext rs:hasWeightIfContextDoesNotMatch ?weightNotMatched }
OPTIONAL
{ ?userContext rs:doNotRecommendInCaseNotMatch true
BIND(1 AS ?skip_)
}
bind(if (bound(?skip_) && (not EXISTS {?user a ?userClass}) , ?skip_, 0) as ?skip1)
values (?defaultUserMatched ?defaultUserNotMatched) {(1 0.5)}
BIND(if(EXISTS { ?user rdf:type ?userClass }, coalesce(?weightMatched, ?defaultUserMatched), coalesce(?weightNotMatched, ?defaultUserNotMatched)) AS ?weight)
}
values ?defaultNoUserContext {1}
BIND(if(bound(?skip1), ?skip1, 0) as ?skip)
BIND( if ( !?doesItemBelongToUserContextItemClass , ?defaultNoUserContext ,if(bound(?weight), ?weight, ?defaultNoUserContext)) AS ?userContextWeight)
}
在更新中,我检查项目是否属于该类,是否使用此bind
bind (if ( exists {?item rdf:type ?itemClass .}, true , false) as ?doesItemBelongToUserContextItemClass)
然后在可选
之外执行此操作
BIND( if ( !?doesItemBelongToUserContextItemClass , ?defaultNoUserContext ,if(bound(?weight), ?weight, ?defaultNoUserContext)) AS ?userContextWeight)
我的问题是当项目不属于类时,?userContextWeight
的值是?weightNotMatched
,但它应该是?defaultNoUserContext
(请再次查看上一个绑定)
有什么想法吗
更新2
通过!?SiteMBelongTouserContextItemClass
我是说我们在代数中学习的普通布尔值不是,也许这里和那里不一样?这可能是问题所在
更新3
我看到这个
bind (if ( exists {?item a ?itemClass }, true , false) as ?doesItemBelongToUserContextItemClass)
始终将true
指定给DoeSitembeLongtouseContextItemClass
,即使这不正确,但对于特定的项
,它不是来自项类
现在我确信问题就在这里,因为我打印了
DoeSitembeLongtouseContextItemClass的值,它总是正确的
,但这并不正确,我们很接近,所以只要解决这个问题就会解决问题您的查询太大了,我很难理解它,但我最好的猜测是,您遇到了这样一种情况,即您的存在表达式没有绑定所有变量,您需要让它测试您想要测试的内容。以下是一些非常简单的数据:
?isCommonClass始终为真,即使当?a和?b相同时它似乎应该为真,否则为假。我认为这里发生的事情是,绑定在一个尚未设置?b或?aClass的上下文中进行评估,因此存在实际上是在检查更一般的内容。我们可以通过将绑定移动到可选之外来测试这一点:
选择*where{
一门课。
可选的{
b a b类。
}
绑定(以isCommonClass形式存在{b a?aClass})
}
---------------------------------------------
|a | a类| b | b类|是普通类|
=============================================
|:s |:D |:s |:D |真|
|:s |:D |:t |:E |假|
|:t |:E |:s |:D |假|
|:t |:E |:t |:E |真|
---------------------------------------------
在这里,我们得到了我们期望的结果,当?a和?b相同时?isCommonClass就是真的
问题中的查询片段没有提供足够的信息来确定发生了什么,并且您在评论中提供的查询太大,任何人都无法检查,但这似乎是一个很好的候选人,可以说明您的情况。我不确定您在问什么。最外层的可选项包括一个非可选的“?item rdf:type?itemClass.”,因此如果该项的类型不正确,则整个最外层的可选项不匹配。如果你想让item类在optional中是可选的,你需要这样写。@JoshuaTaylor你的评论很有帮助,我现在可以看到一些新的东西,我正在尝试,我会回来的you@JoshuaTaylor我更新了我的问题,我想我们已经接近解决方案了,这只是一件小事,你能检查一下更新吗?(如果代码不清楚,我已经准备好为您清除)@JoshuaTaylor我刚刚更新了我的问题,听起来像最后一个
bind
语句中的第一个if
语句从来没有给出过真值。@JoshuaTaylor我做了第三次更新,您能检查一下吗?我知道查询很大,但如果您格式化,您会看到它只是两部分,第一个给出项目,第二个检查这些项目是否有上下文,您的答案是逻辑的,但我需要找出如何在我的案例中测试它,让我试试。我不确定这是否是原因,因为如果您对我提供的数据执行查询(即使您对查询或数据一无所知)您可以看到绑定,我为项目和项目类选择了,并且都设置了,正如您看到的,项目类在绑定之前,项目与wellooops相同,我绑定了(?项目为?www)并选择了?www,但都为空,这就解释了发生了什么,omg:(:)(@Ania当我将此方法应用于您的查询时,结果中有三行,一行为false,三行为true,这与您的“whatTheF*ckIsYourValue”不同变量,这是四个真的。所以我认为这个答案中描述的问题可能也适用于你的查询。我需要问另一个更好的问题,那是另一个问题,谢谢,你就是那个问题
@prefix : <urn:ex:>
:s a :D .
:t a :E .