GetLocalName Йены не возвращает числовое локальное имя с Turtle

1

Согласно списку изменений, сериализация Turtle RDF поддерживает числовые локальные имена с августа 2011 года. В следующем коде Jena результат getLocalName() в URI http://www.foo.com/123456 не равен 123456. Это ошибка в Йене?

String turtle = "<http://www.foo.com/123456>  a  <http://www.foo.com/number>";
Model model = ModelFactory.createDefaultModel()
    .read(new ByteArrayInputStream(turtle.getBytes(StandardCharsets.UTF_8)), null, "TURTLE");

Resource foo = model.listSubjects().next();
String localName = foo.getLocalName();
assert localName.equals("123456");
  • 1
    Как примечание, вы можете получить ресурс немного проще с ResourceFactory.createResource("http://example.com/123456") . Вы можете сделать свой тест ResourceFactory.createResource("http://example.com/123456").getLocalName() . Там нет необходимости разбирать и создавать модели.
Теги:
jena
rdf
turtle-rdf
apache-jena

1 ответ

3
Лучший ответ

Код не указывает на ошибку. Сериализация черепах может разрешать числовые локальные имена, но Jena getLocalName() "возвращает имя этого ресурса в своем пространстве имен". Это небольшая неопределенность, поскольку она не говорит, что такое "пространство имен". Однако есть и исторический контекст. В более ранних стандартах RDF, с 2004 года, RDF/XML был наиболее распространенным форматом. В свете этого неудивительно, что реализация getLocalName() в Node_URI использует Util.spltNamespace, основанную на XML-концепции локальных имен. Документация Util.splitNamespace относится к поиску NCName, которое представляет собой концепцию XML:

Учитывая абсолютный URI, определите точку разделения между частью пространства имен и частью локального имени. Если нет действительной части локального имени, возвращается длина строки.

Алгоритм пытается найти самое длинное имя NCName в конце uri, а не сразу предшествует первый двоеточие в строке.

@param uri
@верните индекс первого символа локального имени

Теперь есть еще одна возможная путаница, которая важна для решения. RDF представляет собой абстрактное представление данных. График RDF (или модель, как их называет Йена) - всего лишь тройка. Turtle, N3, N-Triples и RDF/XML - это просто форматы сериализации для RDF. Модель Jena может быть сериализована во множестве разных форматов, но она не отслеживает, какой формат сериализации содержал ее содержимое. (Действительно, вы можете заполнить модель, не читая троек из любого файла вообще.) Это означает, что хотя Jena сможет прочитать файл Turtle, содержащий контент, такой как:

@prefix : <http://example.org/>.
:12345 a :number .

модель не будет знать, что IRI http://www.example.org/123456 появился в файле как : 123456. Стоит отметить, как отметил AndyS в комментариях, что сериализация Jena Turtle узнает, что IRI http://example.org/123456 может быть написана как : 123456 и будет использовать эту сокращенную версию.

  • 0
    Хороший обзор ситуации. Йена также печатает в Черепахе как ": 12345". getLocalName отражает тот факт, что RDF / XML использовался в качестве основного формата для «RDF 1.0» (RDF 2004).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню