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

Я хотел бы использовать префикс owl: в сериализации XML моей онтологии RDF (с использованием rdflib версии 4.1.1); К сожалению, я все еще получаю сериализацию как rdf:Description Теги 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 описания owl:Ontology должны быть добавлены как хорошая форма к этим обозначениям. Я надеюсь, что rdflib поддерживает полную спецификацию нотации – вместо того, чтобы рулон моей собственной сериализации.

One Solution collect form web for “Использование owl: префикс класса с сериализацией rdflib и xml”

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

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

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

 graph.add((URIRef('https://stackoverflow.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://stackoverflow.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 тройка x rdf:type owl:Ontology не является очень OWL-ориентированным способом объявления онтологии. Похоже, вы ищете что-то более похожее на интерфейс OntModel от Йены (который является просто удобным слоем над RDF-ориентированной моделью Йены) или OWLAPI, но для RDFLib. Я не знаю, существует ли такая вещь (я не пользователь RDFlib), но вы можете взглянуть на:

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