为什么可选绑定不起作用

时间:2016-05-04 10:25:11

标签: sparql rdf semantic-web owl ontology

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

这是我的代码

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)

然后在optional之外我这样做

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

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

有什么想法吗?

更新2

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

更新3

我看到了这个

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

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

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

1 个答案:

答案 0 :(得分:1)

你的查询足够大,我很难理解它,但我最好的猜测是你遇到了存在表达式没有的情况所有变量绑定,您需要使它测试您想要测试的内容。这是一些非常简单的数据:

class ObjectFeatureInline(admin.TabularInline):
    model = ObjectFeature
    can_delete = True
    verbose_name_plural = 'Object features'

class ObjectAdmin(admin.ModelAdmin):
    inlines = (ObjectFeatureInline,)
    ...

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

@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)
  }
}

?isCommonClass总是正确的,即使它看起来应该是真的吗?a和?b是相同的,否则是假的。我认为这里发生的事情是 bind 在尚未设置?b或?aClass的上下文中进行评估,因此存在实际上是在检查更通用的东西。我们可以通过在可选之外移动 bind 来测试这一点:

---------------------------------------------
| 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          |
---------------------------------------------
select * where {
  ?a a ?aClass .

  optional {
    ?b a ?bClass .
  }

  bind(exists{?b a ?aClass} as ?isCommonClass)
}

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

问题中的查询代码段不足以确定这是发生了什么,并且您在评论中提供的查询对于其他任何人来说都太大了,但此似乎就像你在你的情况下发生的事情的一个非常好的候选人。