2017-12-06 16 views
2

JSON-LD仕様には、0​​ノードが値の@typeの定義に使用されていることを示すexampleがあります。イェーナJSON-LDコンテキストとJenaのプレフィックス

@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); 
関連する問題