Jena的getLocalName不会使用Turtle返回数字本地名称

时间:2015-03-25 18:42:48

标签: java rdf jena apache-jena turtle-rdf

根据changelog,Turtle RDF序列化自2011年8月起支持数字本地名称。在以下Jena代码中,URI 上的 getLocalName()的结果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 个答案:

答案 0 :(得分:3)

代码不表示错误。 Turtle序列化可以允许数字本地名称,但Jena的getLocalName()&#34;在其名称空间内返回该资源的名称。&#34;这有点不足,因为它没有说出它的命名空间&#34;它的命名空间&#34;是。但是,也有一些历史背景。在早期的RDF标准中,从2004年开始,RDF / XML是最常见的格式。鉴于此, Node_URI getLocalName()的实施使用 Util.spltNamespace 并不奇怪关于XML的本地名称概念。 Util.splitNamespace 的文档是指查找 NCName ,这是一个XML概念:

  

给定绝对URI,确定命名空间之间的分割点   part和localname部分。如果没有有效的localname部分那么   返回字符串的长度。

     

算法尝试在uri的末尾找到最长的NCName,   不会立即在字符串中的第一个冒号前面。

     

@param uri
  @return localname的第一个字符的索引

现在,还有一个可能的混淆是,解决这个问题非常重要。 RDF是一种抽象的数据表示。 RDF图(或Jena称之为模型)只是一组三元组。 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 ,并将使用该缩短版本。