【问题标题】:SPARQL queries equivalence issue?SPARQL 查询等价问题?
【发布时间】:2014-02-03 14:56:42
【问题描述】:

(尤其是@JeenBroekstra)

使用以下图表,我得到了目前在 Sesame 存储库上运行的 SPARQL 查询:

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

由于最后两个可选模式共享一些过滤器,我想我可以合并它们,我得到了这个查询:

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

但是在执行它时,我得到一个空的结果集。

在提交错误请求之前想在这里问一下:您能告诉我查询错误的地方还是芝麻中的错误?

提前致谢, 最大。

编辑:我当然放了 FILTER (bound(?newSupC)) 只是为了暴露失败的模式。在全球范围内,即使变量 ?newSupC 未绑定,我仍然需要所有结果。

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

【问题讨论】:

  • 我还没有确定这是一个错误还是预期的(虽然乍一看它看起来像一个错误),但是在你记录错误报告之前,如果你仍然看到这个问题,你可以试试使用最新的 Sesame 版本 (2.7.10)?自 2.7.2 以来,在 SPARQL 引擎中修复了许多错误,其中至少有一些与处理 OPTIONAL 相关。
  • 这是一个完全不同的查询 - OPTIONAL 中的 OPTIONAL 不像 OPTIONAL 之后的 OPTIONAL。 BIND (?supC as ?newSupC) 发生在内部 OPTIONAL 内部,其中 ?subC 未绑定(范围),因此 ?newSupC 永远不会绑定,并且 FILTER (bound(?newSupC)) 始终为假。
  • @AndyS 再看一眼我认为你是对的。也许您应该将您的评论作为答案发布。
  • Jeen:将 Sesame 更新到 2.7.10,结果是一样的 Andy:经过一些测试,我终于明白你的意思并误用了 BIND 模式。
  • @AndyS 只是为了澄清一些让我很困惑的点: ?subC 变量实际上(并且正如预期的那样)非常绑定在内部 OPTIONAL

标签: sparql sesame


【解决方案1】:

在我想我太坚持尝试合并两个可选模式之后 解决方案更直接:

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

无论如何,感谢您的时间和建议,伙计们。 最大。

【讨论】:

  • 你可以使用UNDEF而不是?__unbound__;这是标准的一部分。
  • @JoshuaTaylor 感谢您的提示,我试过了,但 Sesame 似乎还不支持它。是时候填写我认为的功能请求了
  • Sesame 确实支持这个关键字,但根据标准,UNDEF 不允许作为IF 表达式的一部分。它只能在VALUES 子句中以逐字值的形式出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多