java - 将 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();
解决方案
我会为此使用 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 的开发人员之一)
推荐阅读
- r - 将两个数据框连接到最近的记录
- python - 使用 Binet 公式在 python 中获取较大斐波那契数的准确值
- node.js - TypeError:无法读取未定义的属性“myDate”
- infiniband - 基于本机 Infiniband 的 RDMA
- c# - 如何将 Json 中的 2 个数组解析为 C# 中的 2 个列表?
- reactjs - 在 Typescript React 中使用 setInterval()
- python - 第 6 行,在
get_ipython().run_line_magic('matplotlib', 'inline') AttributeError: 'NoneType' 对象没有属性 'run_line_magic' - c# - C# 等价于?
- php - 按下按钮不起作用时删除行
- prisma - 为什么“...WhereInput”中不再有“OR”运算符?(棱镜 1.25.4)