首页 文章

SPARQL 查询等价问题?

提问于
浏览
2

(尤其是@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(绑定(?newSupC))只是为了暴露失败的模式。在全局视图中,我仍然需要所有结果,即使变量?newSupC 未绑定。

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

1 回答

  • 3

    经过深思熟虑后,我试图合并两个可选模式,其中解决方案更加直接:

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

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

相关问题