执行 SPARQL 查询

Executing a SPARQL query

我创建了一个小ontology。它只有一个名为 methods 的 class 和一个数据类型 属性 action_nb(整数)。

然后我创建了两个个体:

AHP => action_nb = 20

electre => action_nb = 50

我想执行一个简单的查询。 Select 方法,其中 nb_action < 40,结果应该给我 EL1。

<?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY untitled-ontology-77 "http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#" >
]>


<rdf:RDF xmlns="http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#"
     xml:base="http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:untitled-ontology-77="http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77"/>
    


    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Data properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->

    


    <!-- http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#action_nb -->

    <owl:DatatypeProperty rdf:about="&untitled-ontology-77;action_nb">
        <rdfs:domain rdf:resource="&untitled-ontology-77;methods"/>
        <rdfs:range rdf:resource="&xsd;integer"/>
    </owl:DatatypeProperty>
    


    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->

    


    <!-- http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#methods -->

    <owl:Class rdf:about="&untitled-ontology-77;methods"/>
    


    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Individuals
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->

    


    <!-- http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#ahp -->

    <owl:NamedIndividual rdf:about="&untitled-ontology-77;ahp">
        <rdf:type rdf:resource="&untitled-ontology-77;methods"/>
        <action_nb rdf:datatype="&xsd;integer">20</action_nb>
    </owl:NamedIndividual>
    


    <!-- http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#electre -->

    <owl:NamedIndividual rdf:about="&untitled-ontology-77;electre">
        <rdf:type rdf:resource="&untitled-ontology-77;methods"/>
        <action_nb rdf:datatype="&xsd;integer">50</action_nb>
    </owl:NamedIndividual>
</rdf:RDF>



<!-- Generated by the OWL API (version 3.4.2) http://owlapi.sourceforge.net -->

PREFIX ex: <http://example.org/so#>
SELECT ?methods
WHERE {
   ?inst rdf:type ex:methods .
   ?inst ex:action_nb ?value .
FILTER (?value < 40)
}

这是我一直在操作的代码:但是当使用 40 和 2 行过滤时它只给了我一个空行当使用 60

理解如何处理这个问题的关键是理解 RDF 三元组是如何定义的。您已经声明 action_nb 是 属性,其值是您要比较的整数。因此,使用 属性:

创建查询
PREFIX untitled-ontology-77: <http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#>
SELECT ?inst
WHERE {
    ?inst untitled-ontology-77:action_nb ?value .
    FILTER (?value < 40)
}

...其中 FILTER 子句仅允许小于 40 的 action_nb 值。

如果属性在其他class中使用,并且您希望确保只找到methods的成员,那么您还需要查询实例其中 class:

PREFIX untitled-ontology-77: <http://www.semanticweb.org/diabolico/ontologies/2016/3/untitled-ontology-77#>
SELECT ?inst
WHERE {
   ?inst rdf:type untitled-ontology-77:methods .
   ?inst untitled-ontology-77:action_nb ?value .
   FILTER (?value < 40)
}

我怀疑在这种情况下您是否需要 DISTINCT,并且请注意查找所有不同的值是在查询之后执行的,但是成对应用于所有 SELECTED 值。 IE。对于大型结果集,它可能表现不佳。因此,只在必要时才使用DISTINCT