Sparql 包含筛选器的联合案例不存在且可选不生成结果?

Sparql 包含筛选器的联合案例不存在且可选不生成结果?,sparql,rdf,semantic-web,owl,ontology,Sparql,Rdf,Semantic Web,Owl,Ontology,我有一个选择一些项目的查询。如果这些项属于一个特定的类:userfitability,那么我需要检查用户是否也来自同一个类。有四种可能的情况: 该项来自一个类rdfs:subassof:userfitability,用户也来自同一个类。然后检查项目是否包含hasSuitabilityValue的值,并将其分配给变量?suitabilityValue。 该项来自rdfs:Subassof:UserAttibility类,但用户不是,然后检查该项是否包含HasuitabilityNotValue的值

我有一个选择一些项目的查询。如果这些项属于一个特定的类:userfitability,那么我需要检查用户是否也来自同一个类。有四种可能的情况:

该项来自一个类rdfs:subassof:userfitability,用户也来自同一个类。然后检查项目是否包含hasSuitabilityValue的值,并将其分配给变量?suitabilityValue。 该项来自rdfs:Subassof:UserAttibility类,但用户不是,然后检查该项是否包含HasuitabilityNotValue的值,并将其分配给变量?suitabilityValue。 该项不是来自rdfs:Subassof:UserAttibility类,然后将1赋给变量?suitabilityValue。 该项不是来自rdfs:subassof:userfitability类,用户也不是。在这种情况下,什么也不做。 下面提供了到目前为止我的查询以及要测试它的数据。请注意:数据中的:item1应与联合体的左侧匹配,而:item2应与联合体的右侧匹配。似乎右手边永远不会匹配

数据 查询 前缀: 前缀rdfs: 选择?项目?适用性值,其中 { 值?用户{:用户1} 用户:喜欢什么 可选的{ -检查项目是否来自 -rdfs:子类:用户适用性 ?项目a?适用性类别。 ?适用性类别rdfs:子类别:用户适用性。 { -如果用户也来自同一类 ?用户a?适配性类别 可选的{ -检查项目是否具有以下值:hasSuitabilityWeight ?项目:Hasuitability重量?Suitability值可选。 } -如果是,则将其分配给变量 -?适配性值,否则,分配1 -到变量suitabilityValue BindifBind?适配性值可选,?适配性值可选,1作为适配性值 } 协会 { -如果用户不是来自同一类 筛选器不存在{?用户a?suitabilityClass} 可选的{ -如果项的值为HasNotSuitability权重 ?项目:无适用性重量?适用性无价值可选。 } -将其指定给suitabilityValue,否则,将其指定为0 bindifbound?SuiteabilityNotValueOptional,?SuiteabilityNotValueOptional,0作为SuiteabilityValue } } }
所以,我尝试从头开始重新创建这个问题,结果得到的数据与您的非常相似,尽管有点简单。这是我最后使用的数据,它让我避免了一些关于类是否真正合适的过滤

@prefix : <urn:ex:>

:user a :A ;
      :likes :i , :j .

:i a :A ;
   :hasValueYes 1 ;
   :hasValueNo  2 .

:j a :B .
现在,该查询中有一行注释:

#-- ?item ?anyP ?anyO   # (***)
如果取消注释该行,将得到预期的结果:

-----------------------------
| item | value              |
=============================
| :i   | 1                  |
| :j   | "default no value" |
-----------------------------
我认为这里发生的事情是,在第二个可选情况下,因为没有引入绑定的三重模式,因为可选的不匹配,所以联合的那一方不会被包括在内,即使如果允许这一方匹配,绑定也会引入一些绑定。通过添加模式:

?item ?anyP ?anyO
对于查询,至少在联合的这一部分中会有匹配的内容,此时块的其余部分将被包括在内。我使用了?anyP和?anyO来强调它是任意的,但是既然您已经知道?item是一个?itemClass,那么您可以再次包含该三元组,即?item a?itemClass

那么,在你的情况下,如果你只是添加

?user :likes ?item
对于右侧的联合块,您将获得预期的结果:

-----------------------------
| item   | suitabilityValue |
=============================
| :item2 | 0                |
| :item1 | 1.5              |
-----------------------------

对不起,打烊了。现在重新开放了。。这是一个有趣的,你会喜欢的this@JoshuaTaylor谢谢你的回答,然后重新开始:我正在购物,我会再回家检查一下。嗯,我也投了最后一票,所以这真的只是弥补了我的错误。不过,您将在我的回答中看到,您可以用一个更简单的测试用例重现这个问题;您提供的查询和它的一些格式确实很容易让人对绑定表单的位置感到困惑。也就是说,这是一个非常奇怪的问题,我也花了一段时间才知道它是什么。这说明了确保您的示例不仅完整且可验证,而且是最小的是多么重要:总之,Joshua发现得很好。所以我离您很近,我尝试了您的示例,它完全按照需要工作,谢谢您一如既往。只有一件事,您假设?item总是有一个类?itemClass,这不是必需的,我将它们都放在一个optional中,并在optional之后绑定:。再次感谢,我很感激it@AniaDavid是的,在我的示例数据中,项目总是有一个类,因此这是一个安全的行,可以确保匹配。正如我在回答中所说,在您的情况下,安全行应该是?user:likes?item,因为您从外部查询中知道它将始终匹配。这就是我实际添加的内容?user:likes?item,再次感谢,您就是那个
-----------------------------
| item   | suitabilityValue |
=============================
| :item2 | 0                |
| :item1 | 1.5              |
-----------------------------