Контекст JSON-LD и префиксы в Jena

В спецификации JSON-LD есть пример, показывающий, что узел @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",
...
}

person jaco0646    schedule 06.12.2017    source источник
comment
у вас может быть больше шансов получить подробный ответ из списка пользователей Jena (если поблизости есть главный автор средства записи JSON-LD).   -  person AndyS    schedule 06.12.2017


Ответы (2)


Подробный пример приведен по адресу https://github.com/apache/jena/blob/master/jena-arq/src-examples/arq/examples/riot/ExJsonLD.java

Он включает пример передачи объекта JsonLdOptions.

person AndyS    schedule 06.12.2017

Насколько я могу судить, любой контекст 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);
person jaco0646    schedule 12.12.2017