Использование префикса 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 году.