2017-12-06 3 views
2

JSON-LD 사양은 @context 노드가 값의 @type을 정의하는 데 사용되는 example을 표시합니다. 예나Jena의 JSON-LD 컨텍스트와 접두어

, @contextPrefixMap로부터 유도 또는 (자바 Object 및 JSON 문자열을 세터 과부하있다)를 JsonLDWriteContext 의해 지정 될 수있다 보인다.

Jena에서지도 접근법을 사용하여이 예제를 얻을 수 있습니까? 아니면 컨텍스트 개체가 필요합니까? 이 예제에서 JsonLDWriteContext을 생성하기 위해 전달할 수있는 Java Object이 있습니까? 아니면 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", 
... 
} 
+1

(예 : JSON-LD 작성자의 주 작성자가있는 경우) Jena 사용자 목록에 자세한 응답 양식이 표시 될 가능성이 있습니다. – AndyS

답변

0

내가 알 수있는 한, 입력 된 값을 포함하는 모든 JSON-LD 컨텍스트는 문자열로 제공되어야합니다. 필자는 간단한 JSON 문자열을 생성하기 위해 작은 접두사 값과 입력 값을 결합하여 작은 Java 클래스를 작성했습니다.

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);