首页 > 解决方案 > 将 Java HashMap 转换为海龟三元组

问题描述

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

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

有一个更好的方法吗?谢谢!

这是 object 是 Map 的代码:


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

return body.toString();

标签: javahashmapsparqlrdfturtle-rdf

解决方案


我会为此使用 RDF 库,而不是仅仅将字符串粘合在一起,因为它可以更好地保证您的最终结果在语法上是正确的。例如,使用Eclipse RDF4J ,您可以先将 Map 转换为 RDF 模型对象,然后使用 Rio 解析器/编写器序列化为 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 语法,如下所示(当然,如果您需要将其作为文件或作为 Java 中的 String 对象,请使用与 System.out 不同的 OutputStream):

    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" .

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

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

 model.removeNamespace("xsd");

我还使用 RDF4J 记录了一个错误报告,以修复模型构建器中的这种行为。请参阅https://github.com/eclipse/rdf4j/issues/2260

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


推荐阅读