java - 耶拿 : Create a single Statement based on a String object

标签 java parsing rdf jena

我必须解析 N-TRIPLE 内容并对给定类型的每个文字应用修改。

例如,我必须修改每个 WKTLiteral 以使它们使用引用。三元组例如:

"POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>

必须成为:

"<http://www.opengis.net/def/crs/EPSG/0/4326> POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>

我将每个三元组逐行放入 String 对象中,并希望从此字符串创建 Jena 语句。我的目标是使用 Jena 解析器来避免一些脏字符串操作,例如容易出错的 split。

目前我发现做到这一点的唯一方法是:

String line = "%a triple is here%";
//Create an empty model
final Model model = ModelFactory.createDefaultModel();
//Parse and store the RDF triple in the model
RDFDataMgr.read(model, new ByteArrayInputStream(line.getBytes(StandardCharsets.UTF_8)), Lang.NTRIPLES);
//Get all the statements - only 1 if any
final StmtIterator listStatements = model.listStatements();
//Got my statement
final Statement statement = listStatements.next();

我也尝试使用 RDFReader 但不知道如何使用 RDFOutputStream... 为了仅获取从字符串自动创建的 Statement 对象,我必须创建一个模型,使用读取器和迭代器。在我看来,这似乎有点矫枉过正(我切断了大部分测试,例如测试是否有效地存在下一个语句......)。

您知道实现此目标的更有效/更简单的方法吗?

亚瑟。

最佳答案

我不知道您是否会找到比您所拥有的更好的方法,真的,除了您可能应该读取文件的 block 而不是每一行。如果您读取文件的 block ,则可以使用简单的构造 SPARQL 查询来转换整个 block 。这将提供一个新模型,您可以将该模型的 N-TRIPLE 序列化附加到输出文件中(或将其插入新图形等)。假设您有以下数据:

<urn:ex:a> <urn:ex:p> <urn:ex:b>.
<urn:ex:c> <urn:ex:q> "POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>.

然后像这样的查询将生成以下更新的模型:

construct { ?s ?p ?oo }
where {

  #-- constant values pulled out for readability; this
  #-- is optional, of course.
  values (?dt ?prefix) {
    (<http://www.opengis.net/ont/geosparql#wktLiteral>
    "<http://www.opengis.net/def/crs/EPSG/0/4326> ") 
  }

  #-- grab each triple, and bind ?oo to ?o if it doesn't 
  #-- need to be updated, or to a new literal, if it does.
  ?s ?p ?o .
  bind( if( isLiteral(?o) && datatype(?o) = ?dt,
            strdt( concat(?prefix,str(?o)), ?dt ),
            ?o )
        as ?oo )
}
<urn:ex:a> <urn:ex:p> <urn:ex:b> .
<urn:ex:c> <urn:ex:q> "<http://www.opengis.net/def/crs/EPSG/0/4326> POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral> .

如果您要将整个数据集加载到 TDB 实例中,您可以使用某种变体相对轻松地转换整个数据集,然后将最终数据转储到新文件中。

关于java - 耶拿 : Create a single Statement based on a String object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365255/

相关文章:

java - 黑客排名java字符串正则表达式用户名

java - Stackoverflow 映射 (Hibernate)

c++ - 我们如何使用 Qt/C++ 解析 HTTP 响应头字段?

parsing - 如何重用j2me kxml解析器?

rdf - 从 OWL 本体中获取基本命名空间

java - 如何将图像从 Applet 传递到 JSF 支持 bean

Java - if/else 在应该暂停时立即失败

sql-server - 如何从 SQL Server 中的字符串中删除所有非字母字符?

xml - 如何验证 RDF/XML?

rdf - 在 Triplestore 中更新 RDF