2015-12-24 2 views
0

У меня есть файл совой, и я пытаюсь запустить запросы на него, но не получаю никаких результатов, пожалуйста, кто-то поможет мне понять это и объяснить основной запросSPARQL запрос с использованием РДФ: ID не возвращает никаких результатов

public static void main(String[] args) { 
     String filename="H:/Samson_study/nodeTest/hRESTS-TC3/ontology/ApothecaryOntology.owl"; 
     Model model=ModelFactory.createDefaultModel(); 
     OntModel model1=ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM,model); 

     try 
     {   File file=new File(filename); 
      FileInputStream reader=new FileInputStream(file); 
      model.read(reader,null); 


      String query1=" PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX my: <http://127.0.0.1/ontology/ApothecaryOntology.owl#> SELECT ?result WHERE { ?result rdf:ID my:HealthInsuranceNumber .}"; 

      Query query=QueryFactory.create(query1); 
      QueryExecution exe=QueryExecutionFactory.create(query, model1); 
      ResultSet RES=exe.execSelect(); 
      ResultSetFormatter.out(System.out, RES, query); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

онтология выглядит следующим образом:

<?xml version="1.0"?> 
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:owl="http://www.w3.org/2002/07/owl#" 
    xmlns="http://127.0.0.1/ontology/ApothecaryOntology.owl#" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
    xml:base="http://127.0.0.1/ontology/ApothecaryOntology.owl"> 
    <owl:Ontology rdf:about=""/> 
    <owl:Class rdf:ID="Costs"/> 
    <owl:Class rdf:ID="HealthInsuranceNumber"> 
    <owl:disjointWith> 
     <owl:Class rdf:ID="TelephoneNumber"/> 
    </owl:disjointWith> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="Number"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:ID="Room"> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="Ward"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:about="#Ward"> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="Hospital"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:ID="PhysicianID"> 
    <rdfs:subClassOf rdf:resource="#Number"/> 
    </owl:Class> 
    <owl:Class rdf:ID="HospitalPhysician"> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="Physician"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:ID="Name"/> 
    <owl:Class rdf:ID="Symptom"/> 
    <owl:Class rdf:about="#Hospital"> 
    <owl:disjointWith> 
     <owl:Class rdf:ID="EmergencyStation"/> 
    </owl:disjointWith> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="MedicalOrganisation"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:ID="Patient"> 
    <rdfs:subClassOf> 
     <owl:Class rdf:ID="Person"/> 
    </rdfs:subClassOf> 
    </owl:Class> 
    <owl:Class rdf:about="#Physician"> 
    <rdfs:subClassOf rdf:resource="#Person"/> 
    </owl:Class> 
    <owl:Class rdf:ID="EmergencyPhysician"> 
    <rdfs:subClassOf rdf:resource="#Physician"/> 
    </owl:Class> 
    <owl:Class rdf:ID="Treatment"/> 
    <owl:Class rdf:about="#EmergencyStation"> 
    <rdfs:subClassOf> 
     <owl:Class rdf:about="#MedicalOrganisation"/> 
    </rdfs:subClassOf> 
    <owl:disjointWith rdf:resource="#Hospital"/> 
    </owl:Class> 
    <owl:Class rdf:ID="CostAndHealingPlan"/> 
    <owl:Class rdf:ID="OperatingRoom"> 
    <rdfs:subClassOf rdf:resource="#Ward"/> 
    </owl:Class> 
    <owl:Class rdf:ID="Disease"/> 
    <owl:Class rdf:ID="Organisation"/> 
    <owl:Class rdf:ID="PersonName"> 
    <rdfs:subClassOf rdf:resource="#Name"/> 
    </owl:Class> 
    <owl:Class rdf:ID="PublicOrganisation"> 
    <rdfs:subClassOf rdf:resource="#Organisation"/> 
    </owl:Class> 
    <owl:Class rdf:about="#TelephoneNumber"> 
    <owl:disjointWith rdf:resource="#HealthInsuranceNumber"/> 
    <rdfs:subClassOf rdf:resource="#Number"/> 
    </owl:Class> 
    <owl:Class rdf:ID="Drug"/> 
    <owl:Class rdf:ID="DateTime"/> 
    <owl:Class rdf:ID="Diagnosis"/> 
    <owl:Class rdf:about="#MedicalOrganisation"> 
    <rdfs:subClassOf rdf:resource="#PublicOrganisation"/> 
    </owl:Class> 
    <owl:ObjectProperty rdf:ID="Drug_treatDisease"> 
    <rdfs:range rdf:resource="#Disease"/> 
    <rdfs:domain rdf:resource="#Drug"/> 
    </owl:ObjectProperty> 
    <owl:ObjectProperty rdf:ID="ListOfHospitals_consistsOf"> 
    <rdfs:range rdf:resource="#Hospital"/> 
    </owl:ObjectProperty> 
    <owl:ObjectProperty rdf:ID="Disease_medicatedByTreatment"> 
    <rdfs:range rdf:resource="#Treatment"/> 
    <rdfs:domain rdf:resource="#Disease"/> 
    </owl:ObjectProperty> 
    <owl:FunctionalProperty rdf:ID="Drug_hasCosts"> 
    <rdfs:range rdf:resource="#Costs"/> 
    <rdfs:domain rdf:resource="#Drug"/> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Organisation_isAt"> 
    <rdfs:domain rdf:resource="#Organisation"/> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Physician_hasID"> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#InverseFunctionalProperty"/> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    <rdfs:range rdf:resource="#PhysicianID"/> 
    <rdfs:domain rdf:resource="#Physician"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Patient_hasDisease"> 
    <rdfs:domain rdf:resource="#Patient"/> 
    <rdfs:range rdf:resource="#Disease"/> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Organisation_hasTelephoneNumber"> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    <rdfs:range rdf:resource="#TelephoneNumber"/> 
    <rdfs:domain rdf:resource="#Organisation"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Person_hasName"> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    <rdfs:range rdf:resource="#PersonName"/> 
    <rdfs:domain rdf:resource="#Person"/> 
    </owl:FunctionalProperty> 
    <owl:FunctionalProperty rdf:ID="Disease_hasSymptom"> 
    <rdfs:domain rdf:resource="#Disease"/> 
    <rdfs:range rdf:resource="#Symptom"/> 
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> 
    </owl:FunctionalProperty> 
</rdf:RDF> 

<!-- Created with Protege (with OWL Plugin 3.3.1, Build 430) http://protege.stanford.edu --> 

Я не получаю ошибку, но я не знаю, как запросить филин файл, пожалуйста, помогите

+0

Вы загружаете файл в свой «модельный» объект, но затем запрашиваете «model1». Вместо этого попробуйте model1.read (reader, null). –

+0

еще не получил ответа –

+1

Есть ли у вас какие-либо лица в онтологии, или у вас есть только схема? –

ответ

3

Ваш запрос, с новой строкой добавляемых для удобства чтения, является:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX my: <http://127.0.0.1/ontology/ApothecaryOntology.owl#> 

SELECT ?result WHERE { 
    ?result rdf:ID my:HealthInsuranceNumber . 
} 

В то время как вы видите РДФ: ID в файле RDF/XML, это не на самом деле это свойство в RDF троек; вместо этого он используется для указания того, что IRI ресурса в графе RDF. Например, фрагмент кода:

<owl:Class rdf:ID="Costs"/> 

закодировать RDF тройная:

...#Costs rdf:type owl:Class 

где ... является основой IRI вашей онтологии. Это описано в разделе 2.14 Abbreviating URIs: rdf:ID and xml:base спецификации RDF/XML. Эта спецификация довольно длинная и сложная, например RDF/XML. Однако RDF/XML - это просто формат сериализации для RDF. Сама RDF довольно проста. Когда бы ни было возможно, я бы посоветовал вам не смотреть прямо на сериализацию RDF/XML графика RDF. Вместо этого попробуйте сохранить как черепаху. Это намного читательнее для человека, и у вас будет гораздо лучшее представление о том, какие тройки фактически находятся на графике. Например, ваша онтология в Turtle выглядит следующим образом (я не скопировал целиком):

@prefix :  <http://127.0.0.1/ontology/ApothecaryOntology.owl#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 

:Person a  owl:Class . 

:Patient a    owl:Class ; 
     rdfs:subClassOf :Person . 

:HospitalPhysician a owl:Class ; 
     rdfs:subClassOf :Physician . 

:TelephoneNumber a  owl:Class ; 
     rdfs:subClassOf :Number ; 
     owl:disjointWith :HealthInsuranceNumber . 

:Physician_hasID a owl:FunctionalProperty , owl:InverseFunctionalProperty , owl:ObjectProperty ; 
     rdfs:domain :Physician ; 
     rdfs:range :PhysicianID . 

:Disease_hasSymptom a owl:FunctionalProperty , owl:ObjectProperty ; 
     rdfs:domain :Disease ; 
     rdfs:range :Symptom . 

Это почти идентично соответствующий синтаксис SPARQL.

0

Убедись, что онтология и запрос уже точно соответствуют радужке. Вы ищете rdf:ID, равный http://127.0.0.1/ontology/ApothecaryOntology.owl#HealthInsuranceNumber, но ваш базовый IRI не имеет в нем символа #, а значения rdf:ID тоже не являются. Это может означать, что значения в файле выглядят как http://127.0.0.1/ontology/ApothecaryOntology.owlHealthInsuranceNumber вместо того, что вы ожидаете.

+0

Я пробовал ваше предложение, но не возвращал значение –

+0

@Ignazio rdf: id обычно не используется как предикат в RDF (на самом деле это может быть запрещено). Вместо этого он много используется в том же виде, что и rdf: about; это специальный IRI, используемый в сериализации RDF/XML RDF. –

+0

@ Joshua действительно, мне было интересно то же самое. Я собираюсь реплицировать это и распечатать фактические троек, я подозреваю, что запрос ищет неправильный шаблон. – Ignazio