SPARQL查询等价性问题?

SPARQL查询等价性问题?,sparql,sesame,Sparql,Sesame,(特别是@JeenBroekstra) 使用以下图表,我得到了这个SPARQL查询,它目前在Sesame存储库中工作: PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT * FROM <http://spinrdf.org/sp> FROM <http://spinrdf.org/spl> FROM <http://spinrdf.org/spin> FROM

(特别是@JeenBroekstra)

使用以下图表,我得到了这个SPARQL查询,它目前在Sesame存储库中工作:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT *
FROM <http://spinrdf.org/sp>
FROM <http://spinrdf.org/spl>
FROM <http://spinrdf.org/spin>
FROM <http://topbraid.org/examples/kennedysSPIN>
FROM <http://topbraid.org/examples/kennedys>

FROM NAMED <http://topbraid.org/examples/kennedys>
WHERE {
    GRAPH <http://topbraid.org/examples/kennedys> {
        ?s ?p ?o .
    } .
    OPTIONAL {
        FILTER (sameTerm(rdf:type, ?p)) .
        ?o rdfs:subClassOf+ ?supC .
    } .
    OPTIONAL {
        FILTER (sameTerm(rdf:type, ?p) && NOT EXISTS { ?s a ?newSupC . }) .
        ?o rdfs:subClassOf+ ?newSupC .
    } .
    FILTER (bound(?newSupC)) .
}
前缀rdfs:
选择不同的*
从…起
从…起
从…起
从…起
从…起
从命名
在哪里{
图表{
?s?p?o。
} .
可选的{
过滤器(采样仪(rdf:类型,?p))。
o rdfs:子类+?supC。
} .
可选的{
过滤器(sameTerm(rdf:type,?p)&不存在{s a?newSupC.})。
o rdfs:子类+?新闻UPC。
} .
过滤器(绑定(?newSupC))。
}
由于最后两个可选模式共享一些过滤器,我想我可以合并它们,并生成以下查询:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT *
FROM <http://spinrdf.org/sp>
FROM <http://spinrdf.org/spl>
FROM <http://spinrdf.org/spin>
FROM <http://topbraid.org/examples/kennedysSPIN>
FROM <http://topbraid.org/examples/kennedys>

FROM NAMED <http://topbraid.org/examples/kennedys>
WHERE {
    GRAPH <http://topbraid.org/examples/kennedys> {
        ?s ?p ?o .
    } .
    OPTIONAL {
        FILTER (sameTerm(rdf:type, ?p)) .
        ?o rdfs:subClassOf+ ?supC .
        OPTIONAL {
            FILTER ( NOT EXISTS { ?s a ?supC . } ) .
            BIND (?supC as ?newSupC)
        } .
    } .
    FILTER (bound(?newSupC)) .
}
前缀rdfs:
选择不同的*
从…起
从…起
从…起
从…起
从…起
从命名
在哪里{
图表{
?s?p?o。
} .
可选的{
过滤器(采样仪(rdf:类型,?p))。
o rdfs:子类+?supC。
可选的{
筛选器(不存在{s a?supC.})。
绑定(?supC as?newSupC)
} .
} .
过滤器(绑定(?newSupC))。
}
但是当执行它时,我得到一个空的resultset

在提交bug请求之前,我想在这里问一下:你能告诉我哪里的查询是错误的,或者这是芝麻中的bug吗

提前感谢,, 马克斯

EDIT:I当然放置过滤器(绑定(?newSupC))只是为了暴露失败的模式。在全局场景中,即使变量?newSupC未绑定,我仍然需要所有结果

编辑:以下是有关我使用的配置的更多详细信息:
除了命名图,我用RDFS蕴涵更新了这些图。Sesame存储库是一个简单的本机存储库,没有推理支持。

考虑到我一直试图合并两个可选模式,其中 解决方案要直接得多:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT *
FROM <http://spinrdf.org/sp>
FROM <http://spinrdf.org/spl>
FROM <http://spinrdf.org/spin>
FROM <http://topbraid.org/examples/kennedysSPIN>
FROM <http://topbraid.org/examples/kennedys>

FROM NAMED <http://topbraid.org/examples/kennedys>
WHERE {
    GRAPH <http://topbraid.org/examples/kennedys> {
        ?s ?p ?o .
    } .
    OPTIONAL {
        FILTER (sameTerm(rdf:type, ?p)) .
        ?o rdfs:subClassOf  ?supC .
    } .
    BIND (IF(NOT EXISTS { ?s a ?supC . }, ?supC, ?__unbound__) as ?newSupC) . 
}
前缀rdfs:
选择不同的*
从…起
从…起
从…起
从…起
从…起
从命名
在哪里{
图表{
?s?p?o。
} .
可选的{
过滤器(采样仪(rdf:类型,?p))。
o rdfs:supC子类。
} .
绑定(如果(不存在{s a?supC.}、'supC、'uu unbound'uuu)作为新闻UPC)。
}
无论如何,谢谢你们的时间和建议,伙计们。
Max.

我还没有确定这是一个bug还是预期中的bug(虽然乍一看它看起来像个bug),但是在您记录bug报告之前,您是否可以尝试一下最新的Sesame版本(2.7.10)是否仍然存在此问题?自从2.7.2以来,SPARQL引擎中已经修复了许多错误,其中至少有一些与OPTIONALs的处理有关。这是一个根本不同的查询-OPTIONAL内部的OPTIONAL与OPTIONAL之后的OPTIONAL不同。BIND(?supC as?newSupC)发生在内部可选项中,其中?subC未绑定(作用域),因此?newSupC从不绑定,而FILTER(bound(?newSupC))始终为false。@AndyS又看了一眼,我认为您是正确的。Jeen:将Sesame更新为2.7.10,结果是一样的Andy:经过一些测试,我终于理解了你的意思,并误用了绑定模式。@AndyS只是想澄清一些让我非常困惑的问题:?subC变量实际上是(和预期的一样)内部选项非常绑定您可以使用
UNDEF
而不是
?\uuuu unbound\uuuu
;这是标准的一部分。@JoshuaTaylor谢谢你的提示,我试过了,但芝麻似乎还不支持它。填写功能请求的时间我认为Sesame确实支持此关键字,但根据标准
IF
表达式中不允许使用UNDEF。它只能作为逐字值出现在
VALUES
子句中。