【问题标题】:Why is the optional binding not working为什么可选绑定不起作用
【发布时间】:2016-05-04 10:25:10
【问题描述】:

这是一个关于为什么我的代码不起作用的问题,而不是关于如何做某事的问题,这就是我没有向您提供数据的原因,但是如果你想要,我可以给你,但数据将是我的相对较小的本体。

这是我的代码

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。但是,我的代码不会对这些 items 产生任何东西(根本没有任何价值)。请问你知道为什么吗?

再次,如果您需要数据,我非常欢迎给您,谢谢

更新

现在我看得更清楚了,我想要的是:

即使该项目不属于?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)

然后在optional之外我这样做

BIND( if ( !?doesItemBelongToUserContextItemClass , ?defaultNoUserContext ,if(bound(?weight), ?weight, ?defaultNoUserContext)) AS ?userContextWeight)

我的问题是?userContextWeight的值当项目不属于该类时是?weightNotMatched,但它应该是?defaultNoUserContext(请再看最后一次绑定)

有什么想法吗?

更新 2

!?doesItemBelongToUserContextItemClass 我的意思是我们在代数中学习的普通布尔不是,也许这里和那里不一样?这可能是问题所在?

更新 3

我看到了这个

 bind (if ( exists {?item  a  ?itemClass }, true , false) as ?doesItemBelongToUserContextItemClass)

总是将true 提供给doesItemBelongToUserContextItemClass,即使这是不正确的,对于特定的item,它不是来自itemClass

现在我确定问题出在这里,因为我打印了 doesItemBelongToUserContextItemClass 的值并且它始终是正确的但这是不正确的,我们已经接近了,所以只要解决这个问题就可以了解决问题

【问题讨论】:

  • 我不确定你在问什么。最外层的可选项包括一个非可选的“?item rdf:type ?itemClass .”,所以如果项目没有正确的类型,那么整个最外层的可选项不匹配。如果您希望 item 类在 optional 中是可选的,则需要这样编写。
  • @JoshuaTaylor 你的评论很有帮助,我现在可以看到一些新的东西,我正在尝试自己,我会回复你
  • @JoshuaTaylor 我更新了我的问题,我想我们已经接近解决方案了,这只是一件小事,你能检查一下更新吗? (如果您的代码不清楚,我准备好了)
  • @JoshuaTaylor 我刚刚更新了我的问题,听起来最后一个bind 语句中的第一个if 语句永远不会给出真实的。
  • @JoshuaTaylor 我做了第三次更新,你能检查一下吗?

标签: sparql rdf semantic-web owl ontology


【解决方案1】:

您的查询足够大,以至于我很难理解它,但我最好的猜测是您遇到的情况是您的 exists 表达式没有您需要使其测试您想要测试的所有变量。这是一些非常简单的数据:

@prefix : <urn:ex:>

:s a :D .
:t a :E .

现在,看看这个查询和结果:

prefix : <urn:ex:>

select * where {
  #-- Find an individual ?a and (one of)
  #-- the classes that it belongs to.
  ?a a ?aClass .

  optional {
    #-- Find an individual ?b and (one of)
    #-- the classes that it belongs to.
    ?b a ?bClass .

    #-- And bind ?isCommonClass to true or
    #-- false, to indicate whether ?b is
    #-- also an element of ?aClass.
    bind(exists{?b a ?aClass} as ?isCommonClass)
  }
}
---------------------------------------------
| a  | aClass | b  | bClass | isCommonClass |
=============================================
| :s | :D     | :s | :D     | true          |
| :s | :D     | :t | :E     | true          |
| :t | :E     | :s | :D     | true          |
| :t | :E     | :t | :E     | true          |
---------------------------------------------

?isCommonClass 始终为真,即使当 ?a 和 ?b 相同时它似乎应该为真,否则为假。我认为这里发生的事情是 bind 在 ?b 或 ?aClass 尚未设置的上下文中进行评估,因此 存在 实际上是在检查更一般的东西。我们可以通过将 bind 移到 optional 之外来进行测试:

select * where {
  ?a a ?aClass .

  optional {
    ?b a ?bClass .
  }

  bind(exists{?b a ?aClass} as ?isCommonClass)
}
---------------------------------------------
| a  | aClass | b  | bClass | isCommonClass |
=============================================
| :s | :D     | :s | :D     | true          |
| :s | :D     | :t | :E     | false         |
| :t | :E     | :s | :D     | false         |
| :t | :E     | :t | :E     | true          |
---------------------------------------------

在这里,我们得到了我们期望的结果,当 ?a 和 ?b 相同时 ?isCommonClass 为真。

问题中的查询 sn-p 没有提供足够的信息来确定正在发生的事情,并且您在 cmets 中提供的查询太大,其他人无法检查,但这 似乎 em> 非常适合您的情况。

【讨论】:

  • 我知道查询很大,但是如果您格式化,您会看到它只是两部分,第一个给出项目,第二个检查这些项目是否有上下文,你的答案是逻辑,但我需要弄清楚如何在我的情况下对其进行测试,请让我试试
  • 我不确定这是否是原因,因为如果您对我提供的数据执行查询(即使对查询或数据一无所知),您可以看到绑定,我确实选择了项目和 itemClass 并且两者都已设置,并且正如您所看到的 itemClass 在绑定之前并且项目也是相同的
  • oooops 我确实绑定了 (?item as ?www) 并选择 ?www 但都是空的,这就解释了发生了什么,omg :( :( :(
  • @Ania 当我将这种方法应用于您的查询时,我在结果中得到三行,一为假,三行为真,这与您的“whatTheF*ckIsYourValue”变量不同,后者是四真。所以我认为这个答案中描述的问题也可能适用于您的查询。
  • 那我需要问另一个更好的问题,这是一个不同的问题,谢谢,你就是那个
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2012-07-05
  • 2013-05-05
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多