这是一个关于为什么我的代码无效的问题,而不是关于如何做某事的问题,这就是为什么我没有为您提供数据,但是如果你想要,我可以给你,但数据将是我相对较小的本体。
这是我的代码
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>
有什么想法吗?
by !?doesItemBelongToUserContextItemClass
我的意思是我们在代数中学习的普通布尔不,也许在这里它与那里不一样?这可能是问题?
我看到了这个
bind (if ( exists {?item a ?itemClass }, true , false) as ?doesItemBelongToUserContextItemClass)
总是将true
提供给doesItemBelongToUserContextItemClass
,即使这不正确,对于特定的item
,它不是来自itemClass
。
现在我确定问题就在这里,因为我打印了doesItemBelongToUserContextItemClass
的值并且它始终是真的但是这不正确,我们很接近,所以只是解决这将解决问题
答案 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是真的。
问题中的查询代码段不足以确定这是发生了什么,并且您在评论中提供的查询对于其他任何人来说都太大了,但此似乎就像你在你的情况下发生的事情的一个非常好的候选人。