- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些数据来自 RabbitMQ。数据被格式化为三元组,因此来自队列的消息可能如下所示:
:Tom foaf:knows :Anna
其中 :
是我要将数据导入其中的本体的标准命名空间,但导入的其他前缀也是可能的。三元组由主语、属性/谓语和宾语组成,我在每条消息中都知道哪个是哪个。
在接收方,我有一个带有 OWLOntology
的 Java 程序表示本体的对象,新到达的三元组应临时存储在其中以用于推理和其他内容。我设法把三元组变成了耶拿 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 的构造函数失败了。
如果有人能给我指出一个很好的例子。也许有一种我没有想到的更好的方法来实现同样的目标?
最佳答案
OWLRDFConsumer 似乎通常用于连接 RDF 解析器和 OWL 感知处理器。以下代码似乎有效,但是,正如我在评论中指出的那样,有几个地方我需要一个参数并放入我唯一可以使用的东西。
以下代码:创建本体;宣布两个有名字的人,汤姆和安娜;声明一个对象属性,喜欢;并声明一个数据属性,年龄。一旦声明了这些,我们就打印本体只是为了确保它是我们所期望的。然后它创建一个 OWLRDFConsumer。消费者构造函数需要一个本体,一个 AnonymousNodeChecker , 和一个 OWLOntologyLoaderConfiguration .对于配置,我只使用了一个由无参数构造函数创建的配置,我认为这没问题。对于节点检查器,唯一方便的实现器是 TurtleParser,因此我创建了其中一个,将 null
作为 Reader 传递。我认为这没问题,因为不会调用解析器来读取任何内容。那么消费者的handle(IRI,IRI,IRI)和 handle(IRI,IRI,OWLLiteral)方法用于一次处理一个三元组。我们添加三元组
: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 );
}
}
关于java - 如何将 RDF 三元组添加到 OWLOntology?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468984/
在我的程序中,我需要对 OWLOntology 的实例进行深度复制。 我想我需要创建一个新的 OWLOntologyManager: ontologyManager = OWLManager.crea
我必须使用 OWLAPI 来阅读本体;我使用这个JAVA代码: public class OwlApi { public static void main(String[] args) throws
我有一些数据来自 RabbitMQ。数据被格式化为三元组,因此来自队列的消息可能如下所示: :Tom foaf:knows :Anna 其中 : 是我要将数据导入其中的本体的标准命名空间,但导入的其他
我需要将数据从 OWLOntology 对象(OWL api 的一部分)转换为模型对象(Jena Api 的一部分)。我的Java程序应该能够加载owl文件并将其内容发送到fuseki服务器。根据我读
我是一名优秀的程序员,十分优秀!