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 .