我正在为用于特定数据结构的欧洲数据模型(EDM)实施框架,当我要添加属性时遇到问题。例如,考虑以下简单示例(使用Apache Jena 3.9 ):
public static void main(String[] args) {
String NS = "http://my.com/";
Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("edm", EDM_TEST.getURI());
model.setNsPrefix("skos", SKOS.getURI());
Resource repository = model.createResource(NS + "testing_agent");
repository.addProperty(RDF.type, EDM_TEST.Agent);
repository.addProperty(SKOS.altLabel, model.createLiteral("Vasile Alecsandri Museum"));
repository.addProperty(SKOS.prefLabel, model.createLiteral("Vasile Alecsandri National Museum"));
Resource providedCHO = model.createResource(NS + "testing_cho");
providedCHO.addProperty(RDF.type, EDM_TEST.ProvidedCHO);
providedCHO.addProperty(EDM_TEST.currentLocation, repository);
StringWriter out = new StringWriter();
model.write(out, "RDF/XML");
String result = out.toString();
System.out.println(result);
}
结果似乎还可以:
<edm:ProvidedCHO rdf:about="http://my.com/testing_cho">
<edm:currentLocation>
<edm:Agent rdf:about="http://my.com/testing_agent">
<skos:prefLabel>Vasile Alecsandri National Museum</skos:prefLabel>
<skos:altLabel>Vasile Alecsandri Museum</skos:altLabel>
</edm:Agent>
</edm:currentLocation>
</edm:ProvidedCHO>
但这不行,因为EDM不允许 currentLocation 属性使用内部对象。因此,我需要为currentLocation属性生成以下输出:
<edm:ProvidedCHO rdf:about="http://my.com/testing_cho">
<edm:currentLocation rdf:resource="http://my.com/testing_agent"/>
</edm:ProvidedCHO>
<edm:Agent rdf:about="http://my.com/testing_agent">
<skos:prefLabel>Vasile Alecsandri National Museum</skos:prefLabel>
<skos:altLabel>Vasile Alecsandri Museum</skos:altLabel>
</edm:Agent>
如上所述,如何分别创建存储库资源(代理)并从提供的CHO资源链接到 currentLocation 属性?
答案 0 :(得分:1)
Jena 3.0.1和3.9.0之间的区别是RDF / XMl writer的默认选择从普通更改为漂亮。
使用
可以更好地控制格式详细信息的选择RDFDataMgr.write(..,..,RDFFormat.RDFXML_ABBREV)
RDFDataMgr.write(..,..,RDFFormat.RDFXML_PLAIN)
更多控制可用:
http://jena.staging.apache.org/documentation/io/rdfxml_howto.html#advanced-rdfxml-output
要创建一个非常特殊的XML模式,您可能需要取出数据,然后运行XSLT。