【问题标题】:JSON-LD context vs. prefixes in JenaJena 中的 JSON-LD 上下文与前缀
【发布时间】: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 编写器的主要作者在附近)。

标签: types jena prefix 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      相关资源
      最近更新 更多