JSON-LD规范有example,显示@context
节点用于定义值的@type
。
在Jena中,似乎@context
可以从PrefixMap
派生,或由JsonLDWriteContext
指定(其中包含重载的Java Object
的setter和JSON字符串)。
这个例子可以使用map方法在Jena中实现,还是需要上下文对象?在此示例中是否可以传递Java Object
来创建JsonLDWriteContext
,还是需要解析JSON字符串?
换句话说,Jena是否有任何机制可以在没有明确提供JSON的情况下导出这样的上下文?
{
"@context":
{
"modified":
{
"@id": "http://purl.org/dc/terms/modified",
"@type": "http://www.w3.org/2001/XMLSchema#dateTime"
}
},
...
"@id": "http://example.com/docs/1",
"modified": "2010-05-29T14:17:39+02:00",
...
}
答案 0 :(得分:0)
有一个详细的例子 https://github.com/apache/jena/blob/master/jena-arq/src-examples/arq/examples/riot/ExJsonLD.java
它包含一个传递node-sass
对象的示例。
答案 1 :(得分:0)
据我所知,任何包含类型值的JSON-LD上下文都必须以字符串形式提供。我编写了一个小型Java类,通过合并简单的前缀值和类型化的值来生成必要的JSON字符串。
import static java.util.stream.Collectors.joining;
import static org.apache.jena.rdf.model.ResourceFactory.createResource;
import java.util.Map;
import java.util.TreeMap;
public class JsonLDContext {
private static final String ID = "\"@id\": ";
private static final String TYPE = "\"@type\": ";
private final Map<String, String> cxt = new TreeMap<>();
public JsonLDContext(){}
public JsonLDContext(Map<String, String> prefixes) {
putPrefixes(prefixes);
}
public JsonLDContext putPrefixes(Map<String, String> prefixes) {
prefixes.forEach(this::putPrefix);
return this;
}
public JsonLDContext putPrefix(String key, String value) {
cxt.put(key.isEmpty() ? "@vocab" : key, quote(value));
return this;
}
public JsonLDContext putTypedValue(String id, String type) {
String key = createResource(id).getLocalName();
cxt.put(key, generateJsonTypedValue(id, type));
return this;
}
private static String generateJsonTypedValue(String id, String type) {
return '{' + ID + quote(id) + ", " + TYPE + quote(type) + '}';
}
public String json() {
return cxt.entrySet().stream()
.map(entry -> quote(entry.getKey()) + ": " + entry.getValue())
.collect(joining(", ", "{", "}"));
}
private static String quote(String s) {
return '"' + s + '"';
}
}
以上类使用如下。
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.riot.JsonLDWriteContext;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;
import org.apache.jena.riot.WriterDatasetRIOT;
JsonLDWriteContext cxt = new JsonLDWriteContext();
cxt.setJsonLDContext(
new JsonLDContext(/* map of prefixes */)
.putTypedValue("http://purl.org/dc/terms/modified", "http://www.w3.org/2001/XMLSchema#dateTime")
.json()
);
WriterDatasetRIOT writer = RDFDataMgr.createDatasetWriter(RDFFormat.JSONLD);
writer.write(System.out, DatasetFactory.create().asDatasetGraph(), null, null, cxt);