gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:06:30 25 4
gpt4 key购买 nike

我必须解析 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com