Разбор черепахи с помощью python/rdflib, невозможно указать префикс IRI

Я пытаюсь проанализировать файл данных в формате черепахи, используя RDFlib v4.2.2 в Python v3.6.5, работающий на OS X 10.14.3 Mojave. Основываясь на первоначальных сообщениях об ошибках, я понял, что в файле черепахи отсутствует префикс URI словаря: @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

Если я добавлю эту строку в заголовок файла, она будет работать, как и ожидалось. Но было бы неплохо сделать это без редактирования файла данных, так как он может время от времени обновляться источником. Будучи новичком в RDF и Turtle, я просмотрел Документация RDFlib и решил, что мне нужна привязка префикса:

from rdflib import Graph
g = Graph()
g.namespace_manager.bind('prefix', 'xsd:http://www.w3.org/2001/XMLSchema#')
g.parse( 'currency.ttl', format='turtle')

Но никакой радости. Если будет полезно, вот шапка и один пример черепахи из файла, описывающего разные валюты, взятые из Проект Thomson Reuters Open PermID:

@prefix tr-common: <http://permid.org/ontology/common/> .
@prefix tr-currency: <http://permid.org/ontology/currency/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

<https://permid.org/1-500191>
    a                                tr-currency:Currency ;
    tr-common:hasPermId              "500191"^^xsd:string ;
    tr-currency:decimalPlaces        "0"^^xsd:decimal ;
    tr-currency:isCurrencyOf         <http://sws.geonames.org/1835841> ;
    tr-currency:isISOHistorical      false ;
    tr-currency:isPrimaryCurrencyOf  <http://sws.geonames.org/1835841> ;
    tr-currency:iso4217              "KRW"^^xsd:string ;
    tr-currency:iso4217Numeric       "410"^^xsd:string ;
    skos:prefLabel                   "Korean (South) Won" .

Можно ли дополнить префикс URI, содержащийся в файле черепахи, и если да, то как?

Я заметил, что отсутствующий словарь XSD является неотъемлемой частью спецификации Грамматика черепахи. Интересно, возможно ли явное объявление этого параметра в некоторых реализациях?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, фрагмент черепахи, который вы разместили, недействителен. XSD должен быть явно объявлен.

Вы можете прочитать файл как строку и добавить префикс xsd, а затем проанализировать с помощью RDFlib, например:

with open('currency.ttl') as in_file:
    ttl_str = '@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .' + in_file.read()
g.parse(data=ttl_str, format='turtle')

Предполагая, что вы анализируете действительную черепаху, есть ошибка в том, как вы привязываете префикс xsd. Ты хочешь:

from rdflib import Graph
g = Graph()
g.namespace_manager.bind('xsd', 'http://www.w3.org/2001/XMLSchema#')
g.parse( 'currency.ttl', format='turtle')

Я бы посоветовал взглянуть на Документация RDFLib относительно управления пространством имен.

Пространство имен XSD включено в RDFlib. Он импортируется как:

from rdflib.namespace import XSD

Мне нравится предложенный вами подход к добавлению недостающей строки. Вы хотите сказать, что если в моем файле черепахи нет строки префикса XSD, RDFlib не может проанализировать его как есть? Но если это так, то какова цель ручной привязки словаря URI?

TheStumbler 15.03.2019 23:37

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

Ted Lawless 18.03.2019 12:55

Другие вопросы по теме