开发者

API Jena - Get values of data properties

开发者 https://www.devze.com 2023-03-27 19:26 出处:网络
I created an interface in java with 4 labels, 4 textfields and some buttons like \"Add\", \"modify, \"next\", etc. The user will enter name, first name, birth date, etc. After clicking the button \"ad

I created an interface in java with 4 labels, 4 textfields and some buttons like "Add", "modify, "next", etc. The user will enter name, first name, birth date, etc. After clicking the button "add", the information that he has entered will be added on rdf file. I'm using API Jena. The "next" (in french "Suivant") button does not work. When i click "Next", nothing appears on textfields. I don't understand why. Can you explain me what's wrong?

Complete Code:

import java.util.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.ontology.impl.*;
import com.hp.hpl.jena.util.*;
import java.io.*;
import java.awt.*;  
import java.awt.event.*; 
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.XSD;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;


public class FamilyModel extends Frame
{   
TextField[]tabTF=new TextField[4];
Button bAjout, bModifier, bSupprimer, bPrecedent, bSuivant;
OntModel model;
Onto onto;

Button creerBouton(String S, int x, int y)
{
    Button b=new Button(S);
    add(b);         
    b.setBounds(x,y,120,30);
    return b;
}

void creerLabel(String etiquette, int x, int y)
{
    Label la=new Label(etiquette);
    la.setBounds(x,y,100,25);
    add(la);
}


public FamilyModel ()
{
        setLayout (null);
        setBackground (Color.pink);
        setBounds (100,200,600,450);

        creerLabel("Prenom : ",10,50);
        creerLabel("Nom : ",10,100);
        creerLabel("Date de Naissance: ",10,145);
        creerLabel("Genre (H ou F): ",10,190);

        //TextFields
        for(int i=0;i<4;i++)
        {
            tabTF[i]=new TextField("");
            tabTF[i].setBackground(Color.white);
            add(tabTF[i]);
        }
        tabTF[0].setBounds(120,45,150,25);
        tabTF[1].setBounds(120,100,150,25);
        tabTF[2].setBounds(120,145, 100,25);
        tabTF[3].setBounds(120,190, 45,25);

        bAjout=creerBouton("Ajouter",20,250); 
        setVisible(true);

        bModifier=creerBouton("Modifier",138,250); 
        setVisible(true);

        bSupprimer=creerBouton("Supprimer",250,250); 
        setVisible(true);

        bPrecedent=creerBouton("Precedent",360,250); 

        bSuivant=creerBouton("Suivant",450,250); 
        setVisible(true);   

        onto = new Onto();

        readFileRDF();

        traitement(this); 


}



void traitement(Frame fenetre)
{

    bAjout.addActionListener(new ActionAjoutPersonne());
    bSuivant.addActionListener(new ActionSuivant());
}


//Button Add
public class ActionAjoutPersonne implements ActionListener
{

    public void actionPerformed(ActionEvent evt)
    {

        Resource p1 = onto.model.createResource(onto.uriBase+tabTF[0].getText());


        p1.addProperty(onto.aPourPrenom, tabTF[0].getText());         
        p1.addProperty(onto.aPourNom, tabTF[1].getText());         
        p1.addProperty(onto.aDateNaiss, tabTF[2].getText()); 

        if (tabTF[3].getText().equals("F"))
        {
            p1.addProperty(onto.aGenre, tabTF[3].getText()); 
            p1.addProperty(RDF.type, onto.femme);
        }
        else if (tabTF[3].getText().equals("H"))
        {
            p1.addProperty(onto.aGenre, tabTF[3].getText());    
            p1.addProperty(RDF.type, onto.homme);
        }

        StringWriter sw = new StringWriter();
        onto.model.write(sw, "RDF/XML-ABBREV");
        String owlCode = sw.toString();
        File file = new File("d:/Onto1.rdf");
        try{
            FileWriter fw = new FileWriter(file);
            fw.write(owlCode);
            fw.close();
        } catch(FileNotFoundException fnfe){
            fnfe.printStackTrace();} 
        catch(IOException ioe){
                ioe.printStackTrace();
        }                
    }
}



public void readFileRDF(){
     String inputFile="D:/Onto1.rdf";
     try{
     InputStream in =new  FileInputStream(inputFile);
      if (in == null) {  
      System.out.println("File not found");
     }  
      onto.model.read(in," ");

     }catch(Exception e) {
           System.out.println("model.read catched error: " + e);
     }
}

//Button Next
class ActionSuivant implements ActionListener
{
    public void actionPerformed(ActionEvent evt)
    {

        readFileRDF();

        //Instances Classe Personne    
        ExtendedIterator instances=onto.personne.listInstances();


        while (instances.hasNext())
            {

                 Individual thisInstance = (Individual) instances.next();
                 thisInstance.getLocalName();

                 {

                   tabTF[0].setText((thisInstance.getPropertyValue(onto.aPourPrenom)).toString());
                   tabTF[1].setText((thisInstance.getPropertyValue(onto.aPourNom)).toString());
                   tabTF[2].setText((thisInstance.getPropertyValue(onto.aDateNaiss)).toString());
                   tabTF[3].setText((thisInstance.getPropertyValue(onto.aGenre)).toString());
                 }
                 System.out.println("Hello-Apres If");                 
             }
         }
    }


//ontologie
public class Onto 
{
    OntClass personne, genre, homme, femme, feminin, masculin, evenement, deces, mariage, divorce;
    OntModel model;
    String uriBase;
    ObjectProperty aPourFils, aPourFille, aGenre;
    DatatypeProperty aPourNom, aPourPrenom, aDateNaiss;

    public Onto (){
    model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
    uriBase = "http://www.something.com/FAM";
    model.createOntology(uriBase);

    //Classes
    personne = model.createClass(uriBase+"#personne");
开发者_如何学JAVA    femme = model.createClass(uriBase+"#femme");
    homme = model.createClass(uriBase+"#homme");
    genre = model.createClass(uriBase+"#genre");
    feminin = model.createClass(uriBase+"#feminin");
    masculin = model.createClass(uriBase+"#masculin");
    evenement = model.createClass(uriBase+"#evenement");
    deces = model.createClass(uriBase+"#deces");
    mariage = model.createClass(uriBase+"#mariage");
    divorce = model.createClass(uriBase+"#divorce");


    //Sous-classes
    genre.addSubClass(feminin);
    genre.addSubClass(masculin);
    personne.addSubClass(homme);
    personne.addSubClass(femme);
    evenement.addSubClass(deces);
    evenement.addSubClass(mariage);
    evenement.addSubClass(divorce);

    aPourFils = model.createObjectProperty(uriBase+"#aPourFils");
    aPourFils.setDomain(personne);
    aPourFils.setRange(homme);

    aPourFille = model.createObjectProperty(uriBase+"#aPourFille");
    aPourFille.setDomain(personne);
    aPourFille.setRange(femme);

    aGenre = model.createObjectProperty(uriBase+"#aGenre");
    aGenre.setDomain(personne);
    aGenre.setRange(genre);

    aPourNom = model.createDatatypeProperty(uriBase+"#aPourNom"); 
    aPourNom.setDomain(personne);
    aPourNom.setRange(XSD.xstring);

    aPourPrenom = model.createDatatypeProperty(uriBase+"#aPourPrenom"); 
    aPourPrenom.setDomain(personne);
    aPourPrenom.setRange(XSD.xstring);

    aDateNaiss = model.createDatatypeProperty(uriBase+"#aDateNaiss"); 
    aDateNaiss.setDomain(personne);
    aDateNaiss.setRange(XSD.xstring);
    }

}

public static void main(String args[]) 
{

    new FamilyModel();      
}
}

Onto.rdf file:

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:j.0="http://www.something.com/FAM#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://www.something.com/FAM"/>
  <owl:Class rdf:about="http://www.something.com/FAM#divorce">
<rdfs:subClassOf>
  <owl:Class rdf:about="http://www.something.com/FAM#evenement"/>
</rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#masculin">
    <rdfs:subClassOf>
      <owl:Class rdf:about="http://www.something.com/FAM#genre"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#deces">
    <rdfs:subClassOf rdf:resource="http://www.something.com/FAM#evenement"/>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#feminin">
    <rdfs:subClassOf rdf:resource="http://www.something.com/FAM#genre"/>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#mariage">
     <rdfs:subClassOf rdf:resource="http://www.something.com/FAM#evenement"/>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#femme">
    <rdfs:subClassOf>
      <owl:Class rdf:about="http://www.something.com/FAM#personne"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="http://www.something.com/FAM#homme">
    <rdfs:subClassOf rdf:resource="http://www.something.com/FAM#personne"/>
   </owl:Class>
  <owl:ObjectProperty rdf:about="http://www.something.com/FAM#aGenre">
    <rdfs:range rdf:resource="http://www.something.com/FAM#genre"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="http://www.something.com/FAM#aPourFille">
    <rdfs:range rdf:resource="http://www.something.com/FAM#femme"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
  </owl:ObjectProperty>
  <owl:ObjectProperty rdf:about="http://www.something.com/FAM#aPourFils">
    <rdfs:range rdf:resource="http://www.something.com/FAM#homme"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
  </owl:ObjectProperty>
  <owl:DatatypeProperty rdf:about="http://www.something.com/FAM#aPourNom">
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
  </owl:DatatypeProperty>
  <owl:DatatypeProperty rdf:about="http://www.something.com/FAM#aDateNaiss">
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
  </owl:DatatypeProperty>
  <owl:DatatypeProperty rdf:about="http://www.something.com/FAM#aPourPrenom">
    <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
    <rdfs:domain rdf:resource="http://www.something.com/FAM#personne"/>
   </owl:DatatypeProperty>
  <j.0:femme rdf:about="http://www.something.com/FAMRita">
    <j.0:aGenre>F</j.0:aGenre>
    <j.0:aDateNaiss>Mars</j.0:aDateNaiss>
    <j.0:aPourNom>Henriques</j.0:aPourNom>
    <j.0:aPourPrenom>Rita</j.0:aPourPrenom>
  </j.0:femme>
  <rdf:Description rdf:about="http://www.something.com/FAMRicardo">
    <j.0:aGenre>H</j.0:aGenre>
    <j.0:aDateNaiss>maio</j.0:aDateNaiss>
    <j.0:aPourNom>Silva</j.0:aPourNom>
    <j.0:aPourPrenom>Ricardo</j.0:aPourPrenom>
  </rdf:Description>


OK, here's what is happening. When a user hits the Suivant button, the action listener reads the contents of the Onto1.rdf file, and attempts to populate the form with RDF values for resources of rdf:type http://www.something.com/FAM#personne. In that RDF file, there are two resources including ...#FAMRita of rdf:type http://www.something.com/FAM#femme. Since #femme is a sub-type (ie rdfs:subClassOf) #personne, it's reasonable for you to expect that listing instance of the personne OntClass will return the FAMRita instance.

However, that doesn't happen, which is why you don't get your form fields filled in. The reason is this:

public Onto() {
    model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM );

In Jena, the OntModels made with a xxx_MEM profile specifically have no reasoning turned on. This means that the model does not infer that #FAMRita also has type #personne, hence it not returned by the listInstances iterator.

The easy fix is this:

public Onto() {
    model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_MICRO_RULE_INF );

which means that you will get inference, and Rita will show up.

0

精彩评论

暂无评论...
验证码 换一张
取 消