我有来自AMQP消息代理的字符串消息,该消息由RDF语句组成。我想使用Java将其转换为Jena模型,然后将转换后的模型与另一个模型合并为单个模型。我怎么能这样做?
答案 0 :(得分:1)
这可以分为三个逻辑步骤。其中一些,你可能已经做过:
Model
。由于前两个是特定于域的,除非您可以提供一些示例输入,否则您在这里找不到太多帮助。另外,这可能被视为一个单独的问题(例如:'我如何根据RDF语法的存在对字符串进行分区?')
对于第三种,它非常快速和容易。我们假设您有一个N-Triples
格式的文档,您从其余文本中提取了该文档。以下JUnit测试演示了解析该内容并与其内容交互的能力。
final String nTriplesDoc = "<urn:ex:s> <urn:ex:p> <urn:ex:o> . ";
final Model model = ModelFactory.createDefaultModel();
try( final InputStream in = new ByteArrayInputStream(nTriplesDoc.getBytes("UTF-8")) ) {
/* Naturally, you'd substitute the syntax of your actual
* content here rather than use N-TRIPLE.
*/
model.read(in, null, "N-TRIPLE");
}
final Resource s = ResourceFactory.createResource("urn:ex:s");
final Property p = ResourceFactory.createProperty("urn:ex:p");
final Resource o = ResourceFactory.createResource("urn:ex:o");
assertTrue( model.contains(s,p,o) );
编辑/第二部分
在看到你的评论之后,我觉得谨慎添加关于模型合并的另一个注释。在Jena中,您可以通过将所有三元组一起添加来合并模型。这可能会创建一些最终被垃圾收集的剩余模型,这可能不一定是您系统的最佳方案。
final Model model0 = ModelFactory.create();
// Add things to model 0...
final Model model1 = ModelFactory.create();
// Add things to model 1...
final Model merger = ModelFactory.create();
merger.add(model0);
merger.add(model1);
在此示例中,现在需要收集两个源模型。明智的做法是使用现有模型之一作为所有三元组的目标,或者创建两个基础图的并集模型(导致两个图重复使用):
final Model union = ModelFactory.createModelForGraph( new Union(model0.getGraph(), model1.getGraph()) );
我还假设您可以从AMQP服务器获取String
个对象,因此此答案前半部分的#3仍与您的方案相关。