Избегайте вложения элементов в RDF/XML в Apache Jena

Я пытаюсь написать утилиту для экспорта в SKOS, используя Apache Jena. Моя проблема в том, что более широкие или узкие объекты становятся вложенными. Я ожидаю следующий xml, но получаю xmls с вложенными элементами. Я не получаю никакой помощи от учебников. Это просто проблема форматирования или что-то, что связано с тем, как я ее кодирую?

Фактический вывод

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:SKOS="http://www.w3.org/2004/02/skos/core#">
  <SKOS:Concept rdf:about="http://lexicon.ai/P011">
    <SKOS:broader>
      <SKOS:Concept>
        <SKOS:narrower>
          <SKOS:Concept>
            <SKOS:scopeNote>testb</SKOS:scopeNote>
            <SKOS:prefLabel>Disease</SKOS:prefLabel>
          </SKOS:Concept>
        </SKOS:narrower>
        <SKOS:scopeNote>testb</SKOS:scopeNote>
        <SKOS:prefLabel>Disease</SKOS:prefLabel>
      </SKOS:Concept>
    </SKOS:broader>
    <SKOS:altLabel>alt2</SKOS:altLabel>
    <SKOS:altLabel>alt1</SKOS:altLabel>
    <SKOS:scopeNote>test</SKOS:scopeNote>
    <SKOS:prefLabel>Disease</SKOS:prefLabel>
  </SKOS:Concept>
</rdf:RDF>

Ожидаемый результат

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:SKOS="http://www.w3.org/2004/02/skos/core#">
    <SKOS:Concept rdf:about="http://lexicon.ai/P011">
        <SKOS:broader rdf:about="http://lexicon.ai/P012"/>
        <SKOS:altLabel>alt2</SKOS:altLabel>
        <SKOS:altLabel>alt1</SKOS:altLabel>
        <SKOS:scopeNote>test</SKOS:scopeNote>
        <SKOS:prefLabel>Disease</SKOS:prefLabel>
    </SKOS:Concept>
    <SKOS:Concept rdf:about="http://lexicon.ai/P012">
        <SKOS:narrower rdf:about="http://lexicon.ai/P0121"/>
        <SKOS:scopeNote>testb</SKOS:scopeNote>
        <SKOS:prefLabel>Diseaseb</SKOS:prefLabel>
    </SKOS:Concept>
    <SKOS:Concept rdf:about="http://lexicon.ai/P0121">
        <SKOS:scopeNote>testn</SKOS:scopeNote>
        <SKOS:prefLabel>Diseasen</SKOS:prefLabel>
    </SKOS:Concept>
</rdf:RDF>

Коды следующие

Model model = ModelFactory.createDefaultModel();
model.setNsPrefix("SKOS", SKOS.uri);
Model model2 = ModelFactory.createDefaultModel();
model2.setNsPrefix("SKOS", SKOS.uri);
final Resource Entity = model.createResource(personURI);


final Resource broader1 = model.createResource();
final Resource nt1 = model.createResource();

nt1.addProperty(RDF.type, SKOS.Concept);
nt1.addProperty(SKOS.prefLabel, "Diseasen");
nt1.addProperty(SKOS.scopeNote, "testn");

broader1.addProperty(RDF.type, SKOS.Concept);
broader1.addProperty(SKOS.prefLabel, "Diseaseb");
broader1.addProperty(SKOS.scopeNote, "testb");
broader1.addProperty(SKOS.narrower, nt1);

Entity.addProperty(RDF.type, SKOS.Concept);
Entity.addProperty(SKOS.prefLabel, "Disease");
Entity.addProperty(SKOS.scopeNote, "test");

1 ответ

" http://lexicon.ai/P011" не появляется в примере кода Entity не используется.

Есть два model.createResource() который создаст 2 пустых узла.

"Фактический" вывод показывает, что один ресурс был создан с createResource("http://lexicon.ai/P011") и один с пустым узлом. Это выглядит как причина вложения.

Чтобы приблизиться к требуемому выводу, вам нужно будет использовать именованные ресурсы и, возможно, будет лучше с более простым писателем, RDFFormat.RDFXML_PLAIN написание с использованием RDFDataMgr.write,

Другие вопросы по тегам