属性路径等效于SPARQL

时间:2016-01-05 23:13:34

标签: sparql virtuoso

我是一个天真的用户,试图复制导致以下类型字符串的查询:

来自某些(上皮细胞和(某些部分)(子宫颈和(某些部分(智人和(患有某些腺癌)))))

我在黑客马拉松,我们没有本体/ SPARQL专家,我们只是试图从这个本体和SOLR中获取这些相关领域。我们绝望了!

这是来自的网页 http://www.ontobee.org/ontology/CLO?iri=http://purl.obolibrary.org/obo/CLO_000368) 有用地提供页面上使用的所有SPARQL查询。我认为这是相关的查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT DISTINCT ?ref ?refp ?label ?o FROM <http://purl.obolibrary.org/obo/merged/CLO> WHERE {
    ?ref ?refp ?o .
    FILTER ( ?refp IN ( owl:equivalentClass, rdfs:subClassOf ) ) .
    OPTIONAL { ?ref rdfs:label ?label } .
    {
        {
            SELECT ?s ?o FROM <http://purl.obolibrary.org/obo/merged/CLO> WHERE {
                ?o ?p ?s .
                FILTER ( ?p IN ( rdf:first, rdf:rest, owl:intersectionOf, owl:unionOf, owl:someValuesFrom, owl:hasValue, owl:allValuesFrom, owl:complementOf, owl:inverseOf, owl:onClass, owl:onProperty ) )
            }
        }
        OPTION ( TRANSITIVE, t_in( ?s ), t_out( ?o ), t_step( ?s ) as ?link ).
        FILTER ( ?s= <http://purl.obolibrary.org/obo/CLO_0003684> )
    }
}
ORDER BY ?label

但是,我甚至无法检查,因为我的SPARQL端点不支持Virtuoso。 http://sparql.bioontology.org 因此,它在OPTION(TRANSITIVE)上吐出错误。 谁能告诉我相应的标准途径语言?目标节点之间存在不同的路径长度。

1 个答案:

答案 0 :(得分:2)

Virtuoso的传递性运算符比标准SPARQL提供的功能更强大,因此在一般情况下,并不总是可以在单个标准SPARQL查询中表达相同的内容。但是,我认为在这种情况下 是可能的。

以下属性路径将是等效的(免责声明,我没有测试过这个查询,但它应该给你一般的想法):

?o (rdf:first|rdf:rest|owl:intersectionOf|owl:unionOf|owl:someValuesFrom|owl:hasValue|owl:allValuesFrom|owl:complementOf|owl:inverseOf|owl:onClass|owl:onProperty)+ ?s .

完整的查询会变成这样:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT DISTINCT ?ref ?refp ?label ?o FROM <http://purl.obolibrary.org/obo/merged/CLO> WHERE {
    ?ref ?refp ?o .
    FILTER ( ?refp IN ( owl:equivalentClass, rdfs:subClassOf ) ) .
    OPTIONAL { ?ref rdfs:label ?label } .
    {
        {
            SELECT ?s ?o FROM <http://purl.obolibrary.org/obo/merged/CLO> WHERE {
                    ?o (rdf:first|rdf:rest|owl:intersectionOf|owl:unionOf|owl:someValuesFrom|owl:hasValue|owl:allValuesFrom|owl:complementOf|owl:inverseOf|owl:onClass|owl:onProperty)+ ?s .
            }
        }
        FILTER ( ?s= <http://purl.obolibrary.org/obo/CLO_0003684> )
    }
}
ORDER BY ?label

顺便提一下,请注意,变量FILTER上的?s条件之外子选择,这可能会使此查询有点性能损失。由于您未在查询中的任何其他位置使用?s,因此可以进一步简化此部分查询,消除FILTER,如下所示:

    {
        {
            SELECT ?o FROM <http://purl.obolibrary.org/obo/merged/CLO> WHERE {
                    ?o (rdf:first|rdf:rest|owl:intersectionOf|owl:unionOf|owl:someValuesFrom|owl:hasValue|owl:allValuesFrom|owl:complementOf|owl:inverseOf|owl:onClass|owl:onProperty)+ <http://purl.obolibrary.org/obo/CLO_0003684> .
            }
        }
    }