将 Java HashMap 转换为海龟三元组

Converting Java HashMap to turtle triples

我正在尝试从 HashMap 构造 Java 中的 :subject :${key} :${value} 海龟三元组。

我目前正在使用遍历 HashMap 的字符串生成器来执行此操作,但这不是很优雅,而且速度很慢。

有更好的方法吗?谢谢!

下面是对象是 Map 的代码:


object.forEach((k, v) -> body.append(" :").append(k).append(“ :object \"").append(v).append("\" . ")) ;

return body.toString();

在Java,我们能做的最好的就是

interface MyFunc {
  public int sum(int a, int b, int c, int d);
}

// then
MyFunc myFunc = (a, b, c, d) -> a + b + c + d;
myFunc.sum(0, 1, 2, 3);

我会为此使用 RDF 库,而不是仅仅将字符串粘合在一起,因为它可以更好地保证您的最终结果在语法上是正确的。例如,使用 Eclipse RDF4J 时,您可以先将 Map 转换为 RDF 模型对象,然后仅使用 Rio parser/writer 序列化为 Turtle 格式。

假设您的字符串映射是这样的:

    Map<String, String> map = new HashMap<>();
    map.put("property1", "value 1");
    map.put("property2", "value 2");

您可以使用模型构建器首先从地图创建 RDF 模型,例如:

    ModelBuilder mb = new ModelBuilder();
    // set a default namespace
    mb.setNamespace("", "http://example.org/");
    // set the subject of our statements
    mb.subject(":subject1");

    // convert the map to statements about the set subject
    map.forEach((key, value) -> mb.add(":" + key, value));

    Model model = mb.build();

然后您可以使用 RDF 编写器将模型转换为 Turtle RDF 语法,就像这样(使用与 System.out 不同的 OutputStream,如果您需要它作为文件或 [=46] 中的字符串对象=],当然):

    Rio.write(model, System.out, RDFFormat.TURTLE);

输出如下所示:

    @prefix : <http://example.org/> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

    :subject1 :property1 "value 1";
              :property2 "value 2" .

Update 如您所见,输出包含 xsd 命名空间的命名空间定义。这是由 ModelBuilder 自动添加的,因为我们使用的是 xsd:string 类型的文字值("value 1" 和 "value 2")。但是,此数据类型是 RDF 中文字的默认值,因此实际上没有必要将其拼写出来(这就是为什么在输出中它没有说 "value 1"^^xsd:string,而只是说 "value 1")。换句话说,ModelBuilder 在这里有点过分热心,试图提供帮助。

即使不使用命名空间声明,在您的文件中也没有什么坏处,但如果您真的不想让它存在,您可以通过稍微修改代码来删除它,在该行之后添加以下行构建 Model 对象的位置:

 model.removeNamespace("xsd");

我还使用 RDF4J 记录了错误报告以修复 ModelBuilder 中的此行为。参见 https://github.com/eclipse/rdf4j/issues/2260

(披露:我是 RDF4J 的开发人员之一)