/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package itsudparis.tools;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner;
import com.hp.hpl.jena.reasoner.rulesys.Rule;
import com.hp.hpl.jena.util.FileManager;
import java.io.IOException;
import java.io.OutputStream;
/**
*
* @author DO.ITSUDPARIS
*/
public class JenaEngine {
static private String RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
/**
* Charger un modèle à partir d’un fichier owl
* @param args
* + Entree: le chemin vers le fichier owl
* + Sortie: l'objet model jena
*/
static public Model readModel(String inputDataFile) {
// create an empty model
Model model = ModelFactory.createDefaultModel();
// use the FileManager to find the input file
InputStream in = FileManager.get().open(inputDataFile);
if (in == null) {
System.out.println("Ontology file: " + inputDataFile + " not found");
return null;
}
// read the RDF/XML file
model.read(in, "");
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
return model;
}
/**
* Faire l'inference
* @param args
* + Entree: l'objet model Jena avec le chemin du fichier de regles
* + Sortie: l'objet model infere Jena
*/
static public Model readInferencedModelFromRuleFile(Model model, String inputRuleFile) {
InputStream in = FileManager.get().open(inputRuleFile);
if (in == null) {
System.out.println("Rule File: " + inputRuleFile + " not found");
return null;
} else {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
}
List rules = Rule.rulesFromURL(inputRuleFile);
GenericRuleReasoner reasoner = new GenericRuleReasoner(rules);
reasoner.setDerivationLogging(true);
reasoner.setOWLTranslation(true); // not needed in RDFS case
reasoner.setTransitiveClosureCaching(true);
InfModel inf = ModelFactory.createInfModel(reasoner, model);
return inf;
}
/**
* Executer une requete
* @param args
* + Entree: l'objet model Jena avec une chaine des caracteres SparQL
* + Sortie: le resultat de la requete en String
*/
static public String executeQuery(Model model, String queryString) {
Query query = QueryFactory.create(queryString);
// No reasoning
// Execute the query and obtain results
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();
OutputStream output = new OutputStream() {
private StringBuilder string = new StringBuilder();
@Override
public void write(int b) throws IOException {
this.string.append((char) b);
}
//Netbeans IDE automatically overrides this toString()
public String toString() {
return this.string.toString();
}
};
ResultSetFormatter.out(output, results, query);
return output.toString();
}
/**
* Executer un fichier d'une requete
* @param args
* + Entree: l'objet model Jena avec une chaine des caracteres SparQL
* + Sortie: le resultat de la requete en String
*/
static public String executeQueryFile(Model model, String filepath) {
File queryFile = new File(filepath);
// use the FileManager to find the input file
InputStream in = FileManager.get().open(filepath);
if (in == null) {
System.out.println("Query file: " + filepath + " not found");
return null;
} else {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
}
String queryString = FileTool.getContents(queryFile);
return executeQuery(model, queryString);
}
/**
* Executer un fichier d'une requete avec le parametre
* @param args
* + Entree: l'objet model Jena avec une chaine des caracteres SparQL
* + Sortie: le resultat de la requete en String
*/
static public String executeQueryFileWithParameter(Model model, String filepath, String parameter) {
File queryFile = new File(filepath);
// use the FileManager to find the input file
InputStream in = FileManager.get().open(filepath);
if (in == null) {
System.out.println("Query file: " + filepath + " not found");
return null;
} else {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
}
String queryString = FileTool.getContents(queryFile);
queryString = queryString.replace("%PARAMETER%", parameter);
return executeQuery(model, queryString);
}
/**
* Creer une Instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de le classe
* - Le nom de l'instance
* + Sortie: le resultat de la requete en String
*/
static public boolean createInstanceOfClass(Model model, String namespace, String className, String instanceName) {
Resource rs = model.getResource(namespace + instanceName);
if (rs == null)
rs = model.createResource(namespace+instanceName);
Property p = model.getProperty(RDF + "type");
Resource rs2 = model.getResource(namespace + className);
if ((rs2 != null)&&(rs != null) && (p != null)) {
//add new value
rs.addProperty(p,rs2);
return true;
}
return false;
}
/**
* Mettre a jour la valeur d'une propriete objet d'une instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de la première Instance
* - Le nom de la propriete
* - Le nom de la deuxieme Instance
* + Sortie: le resultat de la requete en String
*/
static public boolean updateValueOfObjectProperty(Model model, String namespace, String object1Name, String propertyName, String object2Name) {
Resource rs1 = model.getResource(namespace + object1Name);
Resource rs2 = model.getResource(namespace + object2Name);
Property p = model.getProperty(namespace + propertyName);
if ((rs1 != null) && (rs2 != null) && (p != null)) {
//remove all old values of property p
rs1.removeAll(p);
//add new value
rs1.addProperty(p,rs2);
return true;
}
return false;
}
/**
* Mettre a jour la valeur d'une propriete objet d'une Instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de la premiere Instance
* - Le nom de la propriete
* - Le nom de le deuxieme Instance
* + Sortie: le resultat de la requete en String
*/
static public boolean addValueOfObjectProperty(Model model, String namespace, String instance1Name, String propertyName, String instance2Name) {
Resource rs1 = model.getResource(namespace + instance1Name);
Resource rs2 = model.getResource(namespace + instance2Name);
Property p = model.getProperty(namespace + propertyName);
if ((rs1 != null) && (rs2 != null) && (p != null)) {
//add new value
rs1.addProperty(p,rs2);
return true;
}
return false;
}
/**
* Mettre a jour la valeur d'une propriete datatype d'une Instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de l'Instance
* - Le nom de la propriete
* - La nouvelle valeur
* + Sortie: le resultat de la requete en String
*/
static public boolean updateValueOfDataTypeProperty(Model model, String namespace, String instanceName, String propertyName, Object value) {
Resource rs = model.getResource(namespace + instanceName);
Property p = model.getProperty(namespace + propertyName);
if ((rs != null) && (p != null)) {
//remove all old values of property p
rs.removeAll(p);
//add new value
rs.addLiteral(p, value);
return true;
}
return false;
}
/**
* Ajouter la valeur d'une propriete datatype d'une Instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de l'Instance
* - Le nom de la propriete
* - La valeur
* + Sortie: le resultat de la requete en String
*/
static public boolean addValueOfDataTypeProperty(Model model, String namespace, String instanceName, String propertyName, Object value) {
Resource rs = model.getResource(namespace + instanceName);
Property p = model.getProperty(namespace + propertyName);
if ((rs != null) && (p != null)) {
//add new value
rs.addLiteral(p, value);
return true;
}
return false;
}
/**
* Supprimer toutes les valeurs d'une propriete d'une Instance
* @param args
* + Entree:
* - l'objet model Jena
* - Namespace de l'ontologie
* - Le nom de l'Instance
* - Le nom de la propriete
* + Sortie: le resultat de la requete en String
*/
static public boolean removeAllValuesOfProperty(Model model, String namespace, String objectName, String propertyName) {
Resource rs = model.getResource(namespace + objectName);
Property p = model.getProperty(namespace + propertyName);
if ((rs != null) && (p != null)) {
//remove all old values of property p
rs.removeAll(p);
//add new value
return true;
}
return false;
}
}