Jena 中的 JSON-LD 上下文与前缀

Posted

技术标签:

【中文标题】Jena 中的 JSON-LD 上下文与前缀【英文标题】:JSON-LD context vs. prefixes in Jena 【发布时间】:2017-12-06 01:26:42 【问题描述】:

JSON-LD 规范有一个 example 显示一个 @context 节点用于定义一个值的 @type

在耶拿,似乎@context 可能派生自PrefixMap 或由JsonLDWriteContext 指定(它具有Java Object 和JSON 字符串的重载设置器)。

这个例子可以在耶拿使用地图方法实现还是需要上下文对象?是否可以传递 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",
...

【问题讨论】:

您可能更有可能从 Jena 用户列表中获得详细的响应(如果 JSON-LD 编写器的主要作者在附近)。 【参考方案1】:

有一个详细的设置示例在 https://github.com/apache/jena/blob/master/jena-arq/src-examples/arq/examples/riot/ExJsonLD.java

它包括一个传递JsonLdOptions 对象的示例。

【讨论】:

【参考方案2】:

据我所知,任何包含类型值的 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);

【讨论】:

以上是关于Jena 中的 JSON-LD 上下文与前缀的主要内容,如果未能解决你的问题,请参考以下文章

Jena Fuseki 服务器命令未找到

敏感词过滤算法:前缀树算法

表的 ORM 和前缀

sh Elasticsearch中的JSON-LD

java.util.concurrent的并发 Collection

C# 关键字 Visual Studio 2012