首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何配置RDF4J Rio写入器写入带有特殊字符的IRIs?

如何配置RDF4J Rio写入器写入带有特殊字符的IRIs?
EN

Stack Overflow用户
提问于 2021-07-11 19:11:01
回答 1查看 47关注 0票数 1

我想写一个rdf/turtle格式的rdf4j.model.Model。模型应包含字符为{}的IRI。

当我尝试用rdf4j.rio.Rio编写RDF模型时,{}字符被写成%7B%7D。有没有办法克服这个问题?例如,使用path and query variables创建rdf4j.model.IRI或配置编写器以保留{}字符?

我正在使用org.eclipse.rdf4j:rdf4j-runtime:3.6.2

以下是示例代码片段:

代码语言:javascript
运行
复制
import org.eclipse.rdf4j.model.BNode;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Model;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.model.util.ModelBuilder;
import org.eclipse.rdf4j.rio.*;
import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ExamplePathVariable {

    private final static Logger LOG = Logger.getLogger(ExamplePathVariable.class.getCanonicalName());
    public static void main(String[] args) {

        SimpleValueFactory rdf = SimpleValueFactory.getInstance();
        ModelBuilder modelBuilder = new ModelBuilder();

        BNode subject = rdf.createBNode();
        IRI predicate = rdf.createIRI("http://example.org/onto#hasURI");

        // IRI with special characters !
        IRI object = rdf.createIRI("http://example.org/{token}");

        modelBuilder.add(subject, predicate, object);

        String turtleStr = writeToString(RDFFormat.TURTLE, modelBuilder.build());
        LOG.log(Level.INFO, turtleStr);
    }

    static String writeToString(RDFFormat format, Model model) {
        OutputStream out = new ByteArrayOutputStream();

        try {
            Rio.write(model, out, format,
                    new WriterConfig().set(BasicWriterSettings.INLINE_BLANK_NODES, true));
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                LOG.log(Level.WARNING, e.getMessage());
            }
        }

        return out.toString();
    }
}

这是我得到的:

代码语言:javascript
运行
复制
INFO: 
[] <http://example.org/onto#hasURI> <http://example.org/%7Btoken%7D> .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-18 11:25:28

没有简单的方法来完成您想要做的事情,因为这将导致Turtle中的URI表示在语法上无效。

字符'{‘和'}',即使它们实际上不是URI中的保留字符,也不允许它们以未编码的形式存在于URI中(请参阅https://datatracker.ietf.org/doc/html/rfc3987)。合法序列化它们的唯一方法是对它们进行百分比编码。

顺便说一下,这段代码的唯一原因是:

代码语言:javascript
运行
复制
IRI object = rdf.createIRI("http://example.org/{token}");

成功的原因是您正在使用的SimpleValueFactory不执行字符验证(出于性能原因)。如果您改用recommended approach (从RDF4J 3.5开始)使用Values静态工厂:

代码语言:javascript
运行
复制
IRI object = Values.iri("http://example.org/{token}");

...you会立即得到一个验证错误。

如果您想要输入一个字符串,而您事先不知道它是否会包含任何无效字符,并且希望有一种尽最大努力将其转换为合法URI的方法,可以使用ParsedIRI.create

代码语言:javascript
运行
复制
IRI object = Values.iri(ParsedIRI.create("http://example.org/{token}").toString());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68335632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档