[英]Reasoner in jena doesn't work
好的,我有一個xml文件,該文件存儲超類“ SentenceFromUser”以及一些隨機問題(例如“您做什么”)的子類(有限制,請執行以下操作:
hasWordOnFirst 一些什么
等等
( 什么是個人)
然后,我定義了稱為OpenQuestion和ClosedQuestion的超類。 在此代碼中,我想查看我的問題將在這兩個超類中的哪一個中進行排序。在Protege中,我可以啟動Reasoner並立即獲得哪種問題。 但是,使用耶拿(Jena)時,推理機並不能真正解決我自己的問題(使用此代碼)。 我希望有人能幫助我...代碼:
public class main {
public static void main (String[] args) {
String state = "learn";
while(0 == 0) {
OntModel m1 = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
m1.read("src/test/new.xml", "RDF/XML");
m1.setStrictMode(false);
String uri = "http://www.semanticweb.org/ontologies/2017/7/untitled-ontology-3#";
Scanner scan = new Scanner(System.in);
System.out.println("Enter a question:");
String input = scan.nextLine();
if (input.equals("exit")) {
break;
}
String[] words = input.split("\\s+");
for (int i = 0; i < words.length; i++) {
words[i] = words[i].replaceAll("[^\\w]", "");
}
//create new question
OntClass sentenceFromUser = m1.getOntClass(uri + "SentenceFromUser");
String questionName = "Question" + ThreadLocalRandom.current().nextInt(1, 100000);
Resource newResQuestion = m1.createResource(uri + questionName);
sentenceFromUser.addSubClass(newResQuestion);
OntClass savedQuestion = m1.getOntClass(uri + questionName);
savedQuestion.addSuperClass(createHasValue(uri, "hasWordOnFirst", words[0], m1));
for (int counter = 1; counter < words.length; counter++) {
OntClass newSuperClass = createHasValue(uri, "hasWord", words[counter], m1);
if(newSuperClass != null) {
savedQuestion.addSuperClass(newSuperClass);
}
else {
if(state.equals("learn")) {
OntClass word = m1.getOntClass(uri + "Word");
ExtendedIterator<OntClass> subClasses = word.listSubClasses();
while(subClasses.hasNext()) {
OntClass sc = subClasses.next();
String subClass = sc.getURI().toString().replaceAll(uri, "");
System.out.print(subClass + "\n");
ExtendedIterator<OntClass> subClassesOfSC = sc.listSubClasses();
while(subClassesOfSC.hasNext()) {
OntClass scosc = subClassesOfSC.next();
String subClassOfSubClass = scosc.getURI().toString().replaceAll(uri, "");
System.out.print("-" + subClassOfSubClass + "\n");
}
}
scan = new Scanner(System.in);
System.out.println("In which Category would you put '" + words[counter] + "'");
input = scan.nextLine();
OntClass category = m1.getOntClass(uri + input);
Individual newWord = m1.createIndividual( uri + words[counter], category );
counter--;
}
}
}
saveModel(m1, "src/test/new.xml", "RDF/XML");
OntModel m2 = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
m2.read("src/test/new.xml", "RDF/XML");
Reasoner r = ReasonerRegistry.getOWLReasoner();
r = r.bindSchema(m2);
OntModelSpec ontModelSpec = OntModelSpec.OWL_DL_MEM;
ontModelSpec.setReasoner(r);
OntModel model = ModelFactory.createOntologyModel(ontModelSpec, m2);
OntClass question = model.getOntClass(uri + questionName);
ExtendedIterator<OntClass> superClasses = question.listSuperClasses();
output(superClasses, uri);
//delete question
OntClass oldResQuestion = m2.getOntClass(uri + questionName);
if(oldResQuestion != null) {
oldResQuestion.remove();
}
saveModel(m2, "src/test/new.xml", "RDF/XML");
}
}
輸出功能
public static void output(ExtendedIterator<OntClass> superClasses, String uri) {
while(superClasses.hasNext()) {
OntResource sc = (OntResource)superClasses.next();
if (sc.getURI() != null) {
String superClass = sc.getURI().toString().replaceAll(uri, "");
System.out.print(superClass);
//String firstSuperClass = question.getSuperClass().getURI().toString().replaceAll(uri, "");
switch (superClass) {
case "OpenQuestion":
System.out.print("open question (W-)\n");
return;
case "ClosedQuestion":
System.out.print("closed question (Yes/No)\n");
return;
default:
break;
}
}
}
return;
}
createHasValue函數
public static OntClass createHasValue(String uri, String propertyName, String individualName, OntModel m) {
Property p = m.getProperty(uri + propertyName);
try {
Individual i = m.getIndividual(uri + individualName.toLowerCase());
return(m.createHasValueRestriction(null, p, i));
}
catch (Exception e) {
return null;
}
}
saveModel函數
public static void saveModel(OntModel m, String file, String type) {
FileOutputStream outputStream;
try {
outputStream = new FileOutputStream(file);
m. write(outputStream, type);
} catch (FileNotFoundException e) {
e.printStackTrace(System.out);
} finally {
m.close();
}
}
我相信這里有兩個問題:
hasWordOnFirst some what
存在主義者需要一個類表達而不是一個個體。 解析器將推斷出what
是一類,對個人進行what
。 您是要使用oneOf {what}
嗎?
其次,您在OntModel
使用write()
。 您是否要寫出推斷的陳述? 在這種情況下,正如write()
的javadoc所說,您需要writeAll()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.