#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:Описание. Точно так же, как в этом другом примере здесь:
Интересно, есть ли ограничение в библиотеке или есть правильный способ закодировать это, чтобы сгенерировать правильный вывод.
Комментарии:
1. Для чего это стоит: оба документа представляют одну и ту же модель RDF. Это просто записано немного по-другому, но значение ваших данных не изменилось.
2. Да, технически должно представлять ту же информацию, но мне интересно, есть ли какой-либо способ предотвратить это, как, похоже, делают другие библиотеки на других языках.