将 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 的开发人员之一)
我正在尝试从 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 的开发人员之一)