Дополнительный RDF: описание добавлено при кодировании троек RDF (сериализованных в XML)

#python #xml #rdf #rdflib

#python #xml — файл #rdf #rdflib #xml

Вопрос:

Я пытаюсь сгенерировать следующий XML с помощью rdflib:

 <?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="#TNFalpha_944">
    <dcterms:modified rdf:parseType="Resource">
        <dcterms:W3CDTF rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2020-09-02T17:07:46.407152</dcterms:W3CDTF>
    </dcterms:modified>
  </rdf:Description>
</rdf:RDF>
  

Однако мне удается вывести только следующий результат, который имеет дополнение rdf:description между dcterms:modified и dcterms:W3CDTF . Кроме того, кажется невозможным включить rdf:parseType="Resource" в <dcterms:modified> тег.

 <?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:dcterms="http://purl.org/dc/terms/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="#TNFalpha_944">
    <dcterms:modified>
      <rdf:Description rdf:nodeID="N947975008f3148c88ca6d2e3fd93f58f">
        <dcterms:W3CDTF rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2020-09-02T17:07:46.407152</dcterms:W3CDTF>
      </rdf:Description>
    </dcterms:modified>
  </rdf:Description>
</rdf:RDF>
  

Код для воспроизведения моей проблемы выглядит следующим образом:

 import rdflib
from rdflib.namespace import Namespace, DCTERMS, RDF, XSD
from datetime import datetime

graph = rdflib.Graph()

graph.bind('dcterms', DCTERMS)
graph.bind('xsd', XSD)
description = rdflib.URIRef(f'#TNFalpha_944')

w3cdtf_node = rdflib.BNode()

date = rdflib.Literal(datetime.now(), datatype=XSD.dateTime)
graph.add((description, DCTERMS.modified, w3cdtf_node))
graph.add((w3cdtf_node, DCTERMS.W3CDTF, date))

ann = graph.serialize(format="pretty-xml").decode('utf-8')
print(ann)
  

У меня такое впечатление, что я упускаю что-то действительно очевидное, но после нескольких часов просмотра документации rdflib и других форумов мне не удается избавиться от этого второго тега rdf:description. Чего мне не хватает?

Заранее большое вам спасибо.

Обновить:

Я думаю, что это как-то связано с пропуском пустых узлов:

https://www.w3.org/TR/rdf-syntax-grammar/#section-Syntax-parsetype-resource

Итак, поскольку невозможно добавить свойство атрибута rdf:parseType="Resource" в <dcterms:modified> , rdflib генерирует дополнительный уровень rdf:Описание. Точно так же, как в этом другом примере здесь:

http://etutorials.org/Misc/Practical resource description framework rdf/Chapter 9. RDF and Perl PHP and Python/9.3 RDF and Python RDFLib/

Интересно, есть ли ограничение в библиотеке или есть правильный способ закодировать это, чтобы сгенерировать правильный вывод.

Комментарии:

1. Для чего это стоит: оба документа представляют одну и ту же модель RDF. Это просто записано немного по-другому, но значение ваших данных не изменилось.

2. Да, технически должно представлять ту же информацию, но мне интересно, есть ли какой-либо способ предотвратить это, как, похоже, делают другие библиотеки на других языках.