4

RabbitMQ からいくつかのデータが入ってきます。データはトリプルとしてフォーマットされるため、キューからのメッセージは次のようになります。

:Tom foaf:knows :Anna

where:は、データをインポートするオントロジーの標準の名前空間ですが、インポートからの他のプレフィックスも可能です。トリプルは、主語、プロパティ/述語、および目的語で構成されており、各メッセージでどれがどれであるかを知っています。

受信側には、オントロジーを表すオブジェクトを持つ Java プログラムがOWLOntologyあり、新しく到着したトリプルを推論などのために一時的に保存する必要があります。なんとかトリプルをイエナに入れることができましたが、それでOntModel終わりです。使用しようとしましOWLRDFConsumerたが、適用方法について何も見つかりませんでした。

私の関数は次のようになります。

public void addTriple(RDFTriple triple) {

    //OntModel model = ModelFactory.createOntologyModel();

    String subject = triple.getSubject().toString();
    subject = subject.substring(1,subject.length()-1);
    Resource s = ResourceFactory.createResource(subject);

    String predicate = triple.getPredicate().toString();
    predicate = predicate.substring(1,predicate.length()-1);
    Property p = ResourceFactory.createProperty(predicate);

    String object = triple.getObject().toString();
    object = object.substring(1,object.length()-1);
    RDFNode o = ResourceFactory.createResource(object);

    Statement statement = ResourceFactory.createStatement(s, p, o);
    //model.add(statement);

    System.out.println(statement.toString());
}

RDFTriple クラスがトリプルの引数の周りに <> を追加し、結果として Statement のコンストラクターが失敗するため、部分文字列操作を行いました。

誰かが素晴らしい例を教えてくれたら。たぶん、同じことを達成するために私が考えていなかったより良い方法がありますか?

4

2 に答える 2

3

OWLRDFConsumer は一般に、RDF パーサーを OWL 対応プロセッサーに接続するために使用されるようです。次のコードは機能しているように見えますが、コメントで指摘したように、引数が必要な場所がいくつかあり、唯一利用できるものを入れました。

次のコード: オントロジーを作成します。Tom と Anna という名前の 2 人の個人を宣言します。オブジェクト プロパティを宣言します。データ プロパティ age を宣言します。これらが宣言されると、期待どおりであることを確認するために、オントロジーを印刷します。次に、OWLRDFConsumer を作成します。コンシューマー コンストラクターには、オントロジー、AnonymousNodeChecker、およびOWLOntologyLoaderConfigurationが必要です。構成は、引数なしのコンストラクタで作成したものをそのまま使用しましたが、それで問題ないと思います。ノード チェッカーの場合、便利なインプリメンターは TurtleParser だけなので、そのうちの 1 つを作成nullして Reader として渡します。パーサーは何も読み取るために呼び出されないため、これで問題ないと思います。次に、消費者のハンドル (IRI,IRI,IRI)handle(IRI,IRI,OWLLiteral)メソッドは、一度に 1 つずつトリプルを処理するために使用されます。トリプルを追加します

:Tom :likes :Anna
:Tom :age 35

次に、オントロジーを再度出力して、アサーションが追加されたことを確認します。すでに RDFTriples を取得しているため、handle() が必要とする引数を引き出すことができるはずです。トリプルを処理する前に、オントロジーには以下が含まれていました。

<NamedIndividual rdf:about="http://example.org/Tom"/>

その後、これ:

<NamedIndividual rdf:about="http://example.org/Tom">
  <example:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">35</example:age>
  <example:likes rdf:resource="http://example.org/Anna"/>
</NamedIndividual>

コードは次のとおりです。

import java.io.Reader;

import org.coode.owlapi.rdfxml.parser.OWLRDFConsumer;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataProperty;
import org.semanticweb.owlapi.model.OWLEntity;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;

import uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser;


public class ExampleOWLRDFConsumer {
    public static void main(String[] args) throws OWLOntologyCreationException, OWLOntologyStorageException {
        // Create an ontology.
        OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
        OWLDataFactory factory = manager.getOWLDataFactory();
        OWLOntology ontology = manager.createOntology();

        // Create some named individuals and an object property.
        String ns = "http://example.org/";
        OWLNamedIndividual tom = factory.getOWLNamedIndividual( IRI.create( ns+"Tom" ));
        OWLObjectProperty likes = factory.getOWLObjectProperty( IRI.create( ns+"likes" ));
        OWLDataProperty age = factory.getOWLDataProperty( IRI.create( ns+"age" ));
        OWLNamedIndividual anna = factory.getOWLNamedIndividual( IRI.create( ns+"Anna" ));

        // Add the declarations axioms to the ontology so that the triples involving
        // these are understood (otherwise the triples will be ignored).
        for ( OWLEntity entity : new OWLEntity[] { tom, likes, age, anna } ) {
            manager.addAxiom( ontology, factory.getOWLDeclarationAxiom( entity ));
        }

        // Print the the ontology to see that the entities are declared. 
        // The important result is
        //  <NamedIndividual rdf:about="http://example.org/Tom"/>
        // with no properties
        manager.saveOntology( ontology, System.out );

        // Create an OWLRDFConsumer for the ontology.  TurtleParser implements AnonymousNodeChecker, so 
        // it was a candidate for use here (but I make no guarantees about whether it's appropriate to 
        // do this).  Since it won't be reading anything, we pass it a null InputStream, and this doesn't
        // *seem* to cause any problem.  Hopefully the default OWLOntologyLoaderConfiguration is OK, too.
        OWLRDFConsumer consumer = new OWLRDFConsumer( ontology, new TurtleParser((Reader) null), new OWLOntologyLoaderConfiguration() );

        // The consumer handles (IRI,IRI,IRI) and (IRI,IRI,OWLLiteral) triples.
        consumer.handle( tom.getIRI(), likes.getIRI(), anna.getIRI() );
        consumer.handle( tom.getIRI(), age.getIRI(), factory.getOWLLiteral( 35 ));

        // Print the ontology to see the new object and data property assertions.  The import contents is
        // still Tom: 
        //   <NamedIndividual rdf:about="http://example.org/Tom">
        //     <example:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">35</example:age>
        //     <example:likes rdf:resource="http://example.org/Anna"/>
        //  </NamedIndividual>
        manager.saveOntology( ontology, System.out );
    }
}
于 2013-07-04T14:59:53.000 に答える