Jena API と Eclipse を使用して、オントロジーの作成、変更、マージに成功しました。EclipseでOWL推論器とPellet推論器を起動することにも成功しました。
ここで、Jena API を使用して Eclipse で簡単なルールを作成する方法と、これを行うためのメソッドが 1 つ以上あるかどうかを理解したいと思います。
たとえば、Protégé では、三角分布の平均を計算するために、SWRL で次のようなルールを記述していました。
TriangularDistribution(?t), hasLowerLimit(?t,?a), hasUpperLimit(?t,?c), hasMode(?t,?b), add(?ab, ?a, ?b), add(?abc, ?ab, ?c), divide(?m, ?abc, 3) -> hasMean(?t, ?m)
Jena を使用してどのように翻訳できますか?
======== アップグレード =========
Jena でルールを作成する方法をよりよく理解するために、https://jena.apache.org/documentation/inference/#RULEexamplesの例に従いました。
3 つのファイルを作成しました。1 つ目は「ReasoningJena.java」です。
package test01;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.*;
import com.hp.hpl.jena.reasoner.rulesys.*;
import com.hp.hpl.jena.vocabulary.ReasonerVocabulary;
import com.hp.hpl.jena.util.*;
import java.io.*;
public class ReasoningJena {
private static Model reason(Model input) {
// Register a namespace to be used in the rules
String flUri = "http://www.snee.com/ns/demo#";
PrintUtil.registerPrefix("fl", flUri);
// Create an (RDF) specification of a hybrid reasoner which loads its rules from an external file.
Model m = ModelFactory.createDefaultModel();
Resource configuration = m.createResource();
configuration.addProperty(ReasonerVocabulary.PROPruleMode, "hybrid");
configuration.addProperty(ReasonerVocabulary.PROPruleSet, "C:/Users/pecore/Desktop/file.rules");
// Create an instance of such a reasoner
Reasoner reasoner = GenericRuleReasonerFactory.theInstance().create(configuration);
// Infere new knowledge on the input model, generating a new one
InfModel infmodel = ModelFactory.createInfModel(reasoner, input);
return infmodel;
}
private static Model readModelFromFile(String filePath) throws Exception {
// Create an empty model
Model model = ModelFactory.createDefaultModel();
// Use the FileManager to find the input file
InputStream in = new FileInputStream(new File(filePath));
// Read the RDF/XML file
model.read(in, "");
return model;
}
public static void main(String[] args){
try {
Model model = readModelFromFile("C:/Users/pecore/Desktop/demoData.rdf");
System.out.println("The model has " + model.size() + " statements");
// Do the reasoning
model = reason(model);
System.out.println("After inferencing the model has " + model.size() + " statements");
}
catch(Exception e) {
e.printStackTrace();
}
}
}
rdf ファイルは「demoData.rdf」です。
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
<!ENTITY demo 'http://jena.hpl.hp.com/demo#'>
]>
<rdf:RDF xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;"
xmlns:demo="&demo;"
xmlns="&demo;"
>
<demo:TransProp rdf:about="&demo;p" />
<rdf:Description rdf:about="&demo;a">
<p rdf:resource="&demo;b" />
</rdf:Description>
<rdf:Description rdf:about="&demo;c">
<p rdf:resource="&demo;a" />
</rdf:Description>
<rdf:Description rdf:about="&demo;b">
<p rdf:resource="&demo;d" />
</rdf:Description>
</rdf:RDF>
ルールファイルは「file.rules」です。
@prefix = "http://www.snee.com/ns/demo#";
[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A > demo:p ?C) ];
Eclipse SW バージョン: Luna Service Release 2 (4.4.2) with JDK 1.7 ですべてを実行すると、次のエラーが発生しました。
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
The model has 4 statements
com.hp.hpl.jena.shared.PrefixMapping$IllegalPrefixException: =
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.checkLegal(PrefixMappingImpl.java:157)
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.setNsPrefix(PrefixMappingImpl.java:67)
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.setNsPrefixes(PrefixMappingImpl.java:147)
at com.hp.hpl.jena.reasoner.rulesys.Rule$Parser.registerPrefixMap(Rule.java:716)
at com.hp.hpl.jena.reasoner.rulesys.Rule.rulesParserFromReader(Rule.java:567)
at com.hp.hpl.jena.reasoner.rulesys.Util.loadRuleParserFromResourceFile(Util.java:264)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.loadRules(FBRuleReasoner.java:270)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner.doSetParameter(GenericRuleReasoner.java:301)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.doSetRDFNodeParameter(FBRuleReasoner.java:370)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.loadConfiguration(FBRuleReasoner.java:101)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner.<init>(GenericRuleReasoner.java:96)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasonerFactory.create(GenericRuleReasonerFactory.java:56)
at test01.ReasoningJena.reason(ReasoningJena.java:24)
at test01.ReasoningJena.main(ReasoningJena.java:55)
なんで?
=========== UPDATE 2 ============ 「file.rules」内部コードにいくつかの変更を加え、次のように修正しました。
@prefix demo: <http://domain/demo#>.
[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A > demo:p ?C) ]
そして、私はこのエラーコードを取得しました:
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
org.apache.jena.riot.RiotException: [line: 1, col: 8 ] The processing instruction target matching "[xX][mM][lL]" is not allowed.
at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
at org.apache.jena.riot.lang.LangRDFXML$ErrorHandlerBridge.fatalError(LangRDFXML.java:253)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.ARPSaxErrorHandler.fatalError(ARPSaxErrorHandler.java:48)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.XMLHandler.warning(XMLHandler.java:200)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.XMLHandler.fatalError(XMLHandler.java:230)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.scanPIData(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanPIData(Unknown Source)
at org.apache.xerces.impl.XMLScanner.scanPI(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.RDFXMLParser.parse(RDFXMLParser.java:151)
at com.hp.hpl.jena.rdfxml.xmlinput.ARP.load(ARP.java:119)
at org.apache.jena.riot.lang.LangRDFXML.parse(LangRDFXML.java:143)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:185)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:906)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:257)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:243)
at org.apache.jena.riot.adapters.RDFReaderRIOT_Web.read(RDFReaderRIOT_Web.java:62)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:247)
at zero.readModelFromFile(zero.java:40)
at zero.main(zero.java:50)