Java 如何向本体添加RDF三元组?

Java 如何向本体添加RDF三元组?,java,rdf,ontology,owl,owl-api,Java,Rdf,Ontology,Owl,Owl Api,我有一些数据来自RabbitMQ。数据被格式化为三元组,因此来自队列的消息可能如下所示: public void addTriple(RDFTriple triple) { //OntModel model = ModelFactory.createOntologyModel(); String subject = triple.getSubject().toString(); subject = subject.substring(1,subject.length(

我有一些数据来自RabbitMQ。数据被格式化为三元组,因此来自队列的消息可能如下所示:

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());
}
:汤姆·福夫:知道:安娜
其中,
是我要将数据导入的本体的标准名称空间,但也可以使用导入的其他前缀。三元组由主语、属性/谓词和宾语组成,我知道每条消息中哪个是哪个

在接收端,我有一个Java程序,其中包含一个表示本体的对象,新到达的三元组应该临时存储在其中,以便进行推理和其他操作。 我设法让三人组进入耶拿,但这就是结局。我试图使用,但我找不到任何关于如何应用它

我的函数如下所示:

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类围绕三元组的参数进行了添加,结果导致语句的构造函数失败


如果有人能给我举个例子,那就太好了。也许有一种我没有想到的更好的方法来实现同样的目标?

似乎OWLRDFConsumer通常用于连接RDF解析器和OWL感知处理器。不过,正如我在评论中所指出的那样,下面的代码似乎是可行的,在一些地方,我需要一个参数,并输入唯一可用的内容

下面的代码:创建一个本体;宣布两名被点名的个人,汤姆和安娜;声明一个对象属性,如;并声明一个数据属性age。一旦声明了这些,我们就打印本体,以确保它是我们所期望的。然后创建一个OWLRDFConsumer。使用者构造函数需要本体、和。对于配置,我只使用了一个由无参数构造函数创建的,我认为这没关系。对于节点检查器,唯一方便的实现者是TurtleParser,因此我创建了其中一个,将
null
作为读取器传递。我认为这是可以的,因为解析器不会被调用来读取任何内容。然后,使用消费者的方法一次处理一个三元组。我们加上三元组

汤姆:喜欢:安娜 字体汤姆:35岁 然后再次打印出本体,以确保添加了断言。既然您已经获得了RDFTriples,那么您应该能够提取handle()所需的参数。在处理三元组之前,本体包含:


然后呢,


35
代码如下:

导入java.io.Reader;
导入org.coode.owlapi.rdfxml.parser.OWLRDFConsumer;
导入org.semanticweb.owlapi.apibinding.OWLManager;
导入org.semanticweb.owlapi.model.IRI;
导入org.semanticweb.owlapi.model.OWLDataFactory;
导入org.semanticweb.owlapi.model.OWLDataProperty;
导入org.semanticweb.owlapi.model.owleEntity;
导入org.semanticweb.owlapi.model.OWLNamedIndividual;
导入org.semanticweb.owlapi.model.OWLObjectProperty;
导入org.semanticweb.owlapi.model.OWLOntology;
导入org.semanticweb.owlapi.model.owletologyCreationException;
导入org.semanticweb.owlapi.model.owletologyLoaderConfiguration;
导入org.semanticweb.owlapi.model.owletologyManager;
导入org.semanticweb.owlapi.model.owletologyStorageException;
导入uk.ac.manchester.cs.owl.owlapi.turtle.parser.TurtleParser;
公共类示例OWLRDFCONSUMER{
公共静态void main(字符串[]args)抛出OWLOntologyCreationException、OWLOntologyStorageException{
//创建一个本体。
OWLOntologyManager=OWLManager.createOWLOntologyManager();
OWLDataFactory=manager.getOWLDataFactory();
OWLOntology=manager.createOntology();
//创建一些命名的个体和对象属性。
字符串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”);
//将声明公理添加到本体中,使三元组
//这些是可以理解的(否则将忽略三元组)。
for(owletentity:newowletentity[]{tom,likes,age,anna}){
manager.addAxiom(ontology,factory.getOWLDeclarationAxiom(entity));
}
//打印本体以查看实体是否已声明。
//重要的结果是
//  
//没有财产
manager.saveOntology(ontology,System.out);
//为本体创建一个OWLRDFConsumer
//这是一个在这里使用的候选者(但我不能保证它是否适合在这里使用)
//这样做)。因为它不会读取任何内容,所以我们向它传递一个空InputStream,而这不会
//*似乎*会导致任何问题。希望默认的owletologyLoader配置也可以。
OWLRDFConsumer consumer=new OWLRDFConsumer(本体,new TurtleParser((Reader)null),new OWLOntologyLoaderConfiguration());
//使用者句柄(IRI、IRI、IRI)和(IRI、IRI、OWLLiteral)三元组。
consumer.handle(tom.getIRI(),likes.getIRI(),anna.getIRI());
consumer.handle(tom.getIRI(),age.getIRI(),factory.getOWLLiteral(35));
//打印本体以查看新的对象和数据属性断言
//汤姆:
//   
//     35
//     
//  
manager.saveOntology(ontology,System.out);
}
}

在ONT-API中,这是一个基于扩展Jena的OWL-API实现,非常简单:

    OWLOntologyManager manager = OntManagers.createONT();
    OWLOntology ontology = manager.createOntology(IRI.create("http://example.com#test"));
    ((Ontology)ontology).asGraphModel().createResource("http://example.com#clazz1").addProperty(RDF.type, OWL.Class);
    ontology.axioms(AxiomType.DECLARATION).forEach(System.out::println);
有关更多信息,请参见