Использование префикса owl:Class с сериализацией rdflib и xml

Я хотел бы использовать owl: префикс в XML-сериализации моей онтологии RDF (с использованием rdflib версии 4.1.1); к сожалению, я все еще получаю сериализацию как rdf:Description теги. Я посмотрел на ответ о связывании пространства имен с графом в RDFLib: Префиксы пространства имен в сериализации XML, но, похоже, это работает только при сериализации с использованием ns формат, а не xml формат.

Давайте будем более конкретными. Я пытаюсь получить следующую онтологию (как взято из введения RDFS и OWL) в XML следующим образом:

<!-- OWL Class Definition - Plant Type -->
<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">

    <rdfs:label>The plant type</rdfs:label>
    <rdfs:comment>The class of all plant types.</rdfs:comment>

</owl:Class>

Вот код Python для создания такой вещи, используя rdflib:

from rdflib.namespace import OWL, RDF, RDFS
from rdflib import Graph, Literal, Namespace, URIRef

# Construct the linked data tools namespace
LDT   = Namespace("http://www.linkeddatatools.com/plants#")

# Create the graph
graph = Graph()

# Create the node to add to the Graph
Plant = URIRef(LDT["planttype"])

# Add the OWL data to the graph
graph.add((Plant, RDF.type, OWL.Class))
graph.add((Plant, RDFS.subClassOf, OWL.Thing))
graph.add((Plant, RDFS.label, Literal("The plant type")))
graph.add((Plant, RDFS.comment, Literal("The class of all plant types")))

# Bind the OWL and LDT name spaces
graph.bind("owl", OWL)
graph.bind("ldt", LDT)

print graph.serialize(format='xml')

К сожалению, даже с этими операторами связывания печатается следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
  <rdf:Description rdf:about="http://www.linkeddatatools.com/plants#planttype">
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
    <rdfs:label>The plant type</rdfs:label>
    <rdfs:comment>The class of all plant types</rdfs:comment>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
</rdf:RDF>

Конечно, это все еще онтология, и ее можно использовать - но поскольку у нас есть различные редакторы, гораздо более компактная и удобочитаемая первая версия, использующая owl Префикс будет гораздо предпочтительнее. Возможно ли сделать это в rdflib без переопределения метода сериализации?

Обновить

В ответ на комментарии я перефразирую свой "бонусный вопрос" как простое разъяснение моего вопроса в целом.

Не бонусный вопрос. В данном разделе рассматривается создание онтологии в формате пространства имен OWL, которая является сокращением для более подробной спецификации RDF/XML. Проблема здесь больше, хотя, чем простое объявление префикса пространства имен для сокращенного обозначения только для классов или свойств, существует много сокращенных обозначений, которые необходимо учитывать в коде; например owl:Ontology описания должны быть добавлены как хорошая форма к этой записи. Я надеюсь, что rdflib поддерживает полную спецификацию нотации, вместо того, чтобы использовать мою собственную сериализацию.

1 ответ

Решение

Вместо использования xml формат, вам нужно использовать pretty-xml формат. Это перечислено в документации, плагин сериализаторов. Это даст вам тип вывода, который вы ищете. То есть, чтобы использовать PrettyXMLSerializer, вы должны использовать следующую строку:

print graph.serialize(format='pretty-xml')

Чтобы ответить на "бонусный вопрос", вы можете добавить строку, подобную следующей, чтобы создать заголовок онтологии, а затем сериализовать с pretty-xml даст вам следующий вывод.

graph.add((URIRef('https://stackru.com/q/24017320/1281433/ontology.owl'), RDF.type, OWL.Ontology ))
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:owl="http://www.w3.org/2002/07/owl#"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
  <owl:Ontology rdf:about="https://stackru.com/q/24017320/1281433/ontology.owl"/>
  <owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">
    <rdfs:comment>The class of all plant types</rdfs:comment>
    <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
    <rdfs:label>The plant type</rdfs:label>
  </owl:Class>
</rdf:RDF>

Добавление x rdf:type owl:Ontology Triple не очень OWL-ориентированный способ объявления онтологии. Похоже, вы ищете что-то более похожее на интерфейс Jena OntModel (который является просто вспомогательным уровнем по сравнению с моделью Jena по RDF-ориентированной модели) или OWLAPI, но для RDFLib. Я не знаю, существует ли такая вещь (я не пользователь RDFlib), но вы могли бы взглянуть на:

  • RDFLib / OWL-RL: Это похоже на рассуждение, но у него могут быть некоторые методы, которые вам нужны.
  • Проверка онтологии с помощью RDFLib: статья в блоге со ссылками на источник, которая может сделать то, что вы хотите.
  • Есть ли библиотека Python для обработки OWL?: Вопрос переполнения стека (теперь не по теме, потому что запросы библиотеки / инструмента не по теме, но это старый вопрос), где принятый ответ указывает на то, что rdflib ориентирован на RDF, а не на OWL, но некоторые другие ответы могут быть полезны, особенно этот, хотя большинство из них были устаревшими, даже в 2011 году.
Другие вопросы по тегам