OWL API バージョン 3.1.0 を利用するプログラムを Java で作成しています。マンチェスター OWL 構文を使用してString
公理を表す があります。この文字列をオブジェクトに変換したいと思います。メソッドOWLAxiom
を使用して結果の公理をオントロジーに追加する必要があるためです addAxiom(OWLOntology owl, OWLAxiom axiom)
(これは のメソッドですOWLOntologyManager
)。どうやってやるの?
1 に答える
次の Java コードのようなものはどうでしょうか。完全ではあるが小さいオントロジーを解析していることに注意してください。完全なオントロジーとして解析できないマンチェスターのテキストだけを実際に期待している場合は、すべてに標準的な接頭辞を追加する必要があるかもしれません。ただし、それは特定のアプリケーションにとってより重要です。また、関心のある種類の公理を取得していることを確認する必要があります。宣言公理 (たとえば、Personがクラスであるなど) は必然的に存在しますが、より関心がある可能性が高いのは、 TBox と ABox の公理なので、それらを取得する方法についていくつかのメモを追加しました。
注意すべき点の 1 つは、公理を既存のオントロジーに追加しようとしているだけの場合は、OWLParser メソッドが行うことですが、Javadoc ではこれが特に明確にされていません (私の意見では)。OWLParser に関するドキュメントには、
OWLParser
は、オントロジー ドキュメントをオントロジーの OWL API オブジェクト表現に解析します。
それは厳密には真実ではありません。parse() へのオントロジー引数に既にコンテンツがあり、parse() がそれを削除しない場合、オントロジー引数はオントロジー ドキュメントのスーパーセットのオブジェクト表現になります (それはオントロジー ドキュメントに前のコンテンツを加えたものです)。幸いなことに、これはまさにあなたがあなたのケースで望んでいることです: テキストのスニペットを読んで、それを既存のオントロジーに追加したいのです。
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.coode.owlapi.manchesterowlsyntax.ManchesterOWLSyntaxParserFactory;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.OWLParser;
import org.semanticweb.owlapi.io.StreamDocumentSource;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
public class ReadManchesterString {
public static void main(String[] args) throws OWLOntologyCreationException, IOException {
// Get a manager and create an empty ontology, and a parser that
// can read Manchester syntax.
final OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
final OWLOntology ontology = manager.createOntology();
final OWLParser parser = new ManchesterOWLSyntaxParserFactory().createParser( manager );
// A small OWL ontology in the Manchester syntax.
final String content = "" +
"Prefix: so: <http://stackoverflow.com/q/21005908/1281433/>\n" +
"Class: so:Person\n" +
"Class: so:Young\n" +
"\n" +
"Class: so:Teenager\n" +
" SubClassOf: (so:Person and so:Young)\n" +
"";
// Create an input stream from the ontology, and use the parser to read its
// contents into the ontology.
try ( final InputStream in = new ByteArrayInputStream( content.getBytes() ) ) {
parser.parse( new StreamDocumentSource( in ), ontology );
}
// Iterate over the axioms of the ontology. There are more than just the subclass
// axiom, because the class declarations are also axioms. All in all, there are
// four: the subclass axiom and three declarations of named classes.
System.out.println( "== All Axioms: ==" );
for ( final OWLAxiom axiom : ontology.getAxioms() ) {
System.out.println( axiom );
}
// You can iterate over more specific axiom types, though. For instance,
// you could just iterate over the TBox axioms, in which case you'll just
// get the one subclass axiom. You could also iterate over
// ontology.getABoxAxioms() to get ABox axioms.
System.out.println( "== ABox Axioms: ==" );
for ( final OWLAxiom axiom : ontology.getTBoxAxioms( false ) ) {
System.out.println( axiom );
}
}
}
出力は次のとおりです。
== All Axioms: ==
SubClassOf(<http://stackoverflow.com/q/21005908/1281433/Teenager> ObjectIntersectionOf(<http://stackoverflow.com/q/21005908/1281433/Person> <http://stackoverflow.com/q/21005908/1281433/Young>))
Declaration(Class(<http://stackoverflow.com/q/21005908/1281433/Person>))
Declaration(Class(<http://stackoverflow.com/q/21005908/1281433/Young>))
Declaration(Class(<http://stackoverflow.com/q/21005908/1281433/Teenager>))
== ABox Axioms: ==
SubClassOf(<http://stackoverflow.com/q/21005908/1281433/Teenager> ObjectIntersectionOf(<http://stackoverflow.com/q/21005908/1281433/Person> <http://stackoverflow.com/q/21005908/1281433/Young>))