Ontology Mapping

Yaptığımız çalışmada bir Java uygulaması ile hazır bir ontoloji üzerinde sorgu çalıştırma yoluyla sonuca ulaşmayı hedefleliyorduk. Üzerinde çalışabileceğimiz hazır bir ontolojimiz yoksa, bu projede yaptığımız gibi, Protege uygulamasını kullanarak kendi ontolojimizi oluşturabiliriz.

Ontolojimizi oluşturduktan sonra aşağıda örneği görülen kod parçası yardımı ile, java içinden bu ontolojiye ulaşabilir, içerdiği class, property ve individual değerlerini alabiliriz.

import com.hp.hpl.jena.ontology.*;

import com.hp.hpl.jena.vocabulary.RDF;

import com.hp.hpl.jena.rdf.model.*;

import com.hp.hpl.jena.util.FileManager;

import com.hp.hpl.jena.shared.ConfigException;

import com.hp.hpl.jena.shared.JenaException;

import com.hp.hpl.jena.query.*;

import com.hp.hpl.jena.shared.PrefixMapping;

import com.hp.hpl.jena.util.iterator.ExtendedIterator;

import com.hp.hpl.jena.util.iterator.Filter;

public class OntoMapper {

static OntModel ontModel = null;

static final String inputFileName = "MyOntology.owl";

static ArrayList classList = null;

static ArrayList propertyList = null;

static ArrayList rootClassesList = null;

static ArrayList individualList = null;

public static OntModel loadOntology(){

try{

ontModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );

InputStream in = FileManager.get().open( inputFileName );

if (in == null) {

throw new IllegalArgumentException( "File: " + inputFileName + " not found");

}

// read the RDF/XML file

ontModel.read(in, "");

}

catch (JenaException jx) {

if (jx.getCause() instanceof NoRouteToHostException

|| jx.getCause() instanceof UnknownHostException

|| jx.getCause() instanceof ConnectException

|| jx.getCause() instanceof IOException) {

System.out.println("Cannot access public internet - content negotiation test not executed");

} else

throw jx;

}

catch(Exception e){

System.out.println(e.getMessage());

}

if(classList == null)

classList = new ArrayList();

if(propertyList == null)

propertyList = new ArrayList();

if(rootClassesList == null)

rootClassesList = new ArrayList();

if(individualList == null)

individualList = new ArrayList();

OntClass superCls = null;

OntClass cls = null;

Property prty = null;

for (Iterator i = ontModel.listClasses(); i.hasNext(); ) {

cls = (OntClass) i.next();

System.out.println( "Class " + cls.getURI() );

classList.add(cls.getURI());

for (Iterator k = cls.listSubClasses( true ); k.hasNext(); )

{

rootClassesList.add(cls.getURI());

break;

}

Iterator iter = ontModel.listIndividuals();

while(iter.hasNext()){

Individual c = (Individual)iter.next();

System.out.println( "Individual " + c.getLocalName() );

individualList.add(c.getLocalName());

cls = (OntClass) c.getOntClass();

superCls = cls.getSuperClass();

Iterator iterTables = c.listProperties();

while (iterTables.hasNext()){

Statement stmt = (Statement)iterTables.next();

//Resource r = (Resource)stmt.getObject();

prty = (Property)stmt.getPredicate();

if (superCls != null)

{

System.out.println( "Property getLocalName::: " + prty.getLocalName());

propertyList.add(prty.getLocalName());

}

else

{

System.out.println( "Property getLocalName::: " + prty.getLocalName());

propertyList.add(prty.getLocalName());

}

}

}

}



İlgili Kaynaklar:
http://protege.stanford.edu/

Generic Question Templates(GQT)

SPARQL dili ontoloji üzerinde arama yaparken “SPARQL triple” olarak bilinen üç anahtara dayalı olarak çalışır. Bu üç anahtarı {class}, {property} ve {value} olarak adlandırabiliriz. Value yerine {object} ve ya {criteria} da gelebilir.

Kullanıcı tarafından girilen soruları işlerken, öncelikle soru yapısını anlamaya çalışmalı; soru içinde bulunan kelimeleri, “SPARQL triple” oluşturacak şekilde ayıklamalıyız. Bir başka deyişle, sorunun içindeki class, property ve value değerlerini bulmalıyız.

Geliştirdiğimiz doğal dil işleme algoritması sonucu elde ettiğimiz veriyi, elimizdeki ontolojiyi dikkate alarak, önceden belirleyeceğimiz soru şablonlarına (Generic Question Template) uydurmaya çalışırız.

Soru şablonlarının öncelikle anahtar kelimelerimize göre belirleneceğini kabul ederek aşağıdaki gibi yapılar belirleriz:


/*** Question Templates
-Which {class} has the {property} with {value}
-Which {class} has the {property} with {criteria}
-Which {class} has the {property}
-Who is the {property} of {value}
-How many {class} are/has {property} by {value}
-When did {value} {property}
-What is the {property} of {value} {class}
-What is the {property} of {class} which has the {value}
*/

Buna göre herbir soru tipini karşılayabilecek ortak bir algortima ile girilen soruyu önceden belirlediğimiz bu soru şablonlarına uygun şekilde işlemek; şablonda varsa class, property ve value değerlerini bulmamız gerekir. Bu değerleri elde etmek için ontolojimiz içinde arama yapmak gerekecektir ki, bir sonraki başlıkta bunu göreceğiz.

Python öğrenme aracı: Acire

Python öğrenmek isteyenler için karşılaştığım bir yazıdaki aracı duyurmak isterim. İngilizce bir araç, ama belki de gönüllü biri Türkçe sürümünü de yapabilir. Acire için karşıma çıkaran yazıyı ve Jono Bacon'un ilgili duyurusunu okuyabilirsiniz.