用于将字符串消息转换为Jena模型的Java代码

时间:2014-04-24 13:46:33

标签: rdf jena amqp

我有来自AMQP消息代理的字符串消息,该消息由RDF语句组成。我想使用Java将其转换为Jena模型,然后将转换后的模型与另一个模型合并为单个模型。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

这可以分为三个逻辑步骤。其中一些,你可能已经做过:

  1. 将RDF语句与非rdf文本隔离
  2. 确定用于RDF的语法(可以是#1的一部分)
  3. 将生成的字符串解析为Apache Jena Model
  4. 由于前两个是特定于域的,除非您可以提供一些示例输入,否则您在这里找不到太多帮助。另外,这可能被视为一个单独的问题(例如:'我如何根据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仍与您的方案相关。