当使用Jena读取RDF(N-Triple)时,它会抛出“com.hp.hpl.jena.shared.InvalidPropertyURIException”

时间:2012-07-10 12:53:13

标签: jena nt

我从dbpedia下载了一个N-Triple文件,但是当我想将它读入Jena模型时,会抛出一些异常.Below是此文件的一部分:

<http://dbpedia.org/resource/Jacky_Cheung> 

<http://dbpedia.org/resource/Template:%E8%97%9D%E4%BA%BA> "\u9AD4\u91CD"@zh .
<http://dbpedia.org/resource/Jacky_Cheung> <http://dbpedia.org/resource/Template:%E8%97%9D%E4%BA%BA> "\u8EAB\u9AD8"@zh .
<http://dbpedia.org/resource/Jacky_Cheung> <http://dbpedia.org/resource/Template:%E8%97%9D%E4%BA%BA> "\u8840\u578B"@zh .
<http://dbpedia.org/resource/Jacky_Cheung> <http://dbpedia.org/resource/Template:%E8%97%9D%E4%BA%BA> "\u8A9E\u8A00"@zh .

抛出的异常是:

Exception in thread "main" com.hp.hpl.jena.shared.InvalidPropertyURIException: http://dbpedia.org/resource/Template:%E8%97%9D%E4%BA%BA
    at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.splitTag(BaseXMLWriter.java:393)
    at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.startElementTag(BaseXMLWriter.java:368)
    at com.hp.hpl.jena.xmloutput.impl.Unparser$3.wTypeStart(Unparser.java:671)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wPropertyEltValueString(Unparser.java:488)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wPropertyEltValue(Unparser.java:473)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wPropertyElt(Unparser.java:339)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wPropertyEltStar(Unparser.java:811)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wTypedNodeOrDescriptionLong(Unparser.java:797)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wTypedNodeOrDescription(Unparser.java:727)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wDescription(Unparser.java:686)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wObj(Unparser.java:642)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wObjStar(Unparser.java:317)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.wRDF(Unparser.java:298)
    at com.hp.hpl.jena.xmloutput.impl.Unparser.write(Unparser.java:200)
    at com.hp.hpl.jena.xmloutput.impl.Abbreviated.writeBody(Abbreviated.java:143)
    at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.writeXMLBody(BaseXMLWriter.java:500)
    at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.write(BaseXMLWriter.java:472)
    at com.hp.hpl.jena.xmloutput.impl.Abbreviated.write(Abbreviated.java:128)
    at com.hp.hpl.jena.xmloutput.impl.BaseXMLWriter.write(BaseXMLWriter.java:458)
    at com.hp.hpl.jena.rdf.model.impl.ModelCom.write(ModelCom.java:277)
    at jena.ReadRDF.main(ReadRDF.java:45)
Java Result: 1

问题是由“%E8%97%9D%E4%BA%BA”引起的,当使用URIref.decode()解码带有此字符串的URI时,“%E8%97%9D%E4%BA%BA “代表两个汉字。

但是当我使用Sesame读取这个N-Triple文件时,没有任何问题就可以了。

我的问题是,是否有任何方法可以解决Jena中的这个问题,以及为什么dbpedia选择N-Triple作为默认的RDF语法?。使用非ASCII语言时效果不佳。

另外,我想知道,如果我想将我的RDF数据发布为关联数据,但资源的URI有一些中文和日文,我应该首先解码URI吗?

1 个答案:

答案 0 :(得分:1)

嗯,你的问题并不完全清楚,因为你问的是“在Jena模型中阅读”,但你引用的堆栈跟踪实际上是从对作者的调用开始的。

总的来说,Jena非常努力地遵守W3C和IETF的相关RDF建议。特别是,它试图不生成任何不符合有效URI规则的URI。在编写XML的情况下,这是复杂的,因为大多数RDF标识符不是合法的XML元素ID,这意味着您必须在某处拆分URI并使用XML命名空间来生成完整标识符。并非所有RDF工具包都与Jena一样特别符合标准中的某些规则。

你可以尝试的事情:

  • 您是否需要在加载过程中调用Model.write()?您应该能够加载和处理模型,而无需检查是否正在调用合法URI。

  • 尝试使用Turtle格式而不是XML来编写输出。 Turtle没有与XML相同的限制,人类也可以轻松阅读。

  • 如果您要加载的数据中存在特定的格式错误的URI,请查看是否有更新版本的数据。 dbpedia中的非法URI过去一直是个问题。如果非法URI仍在最新版本中,请通知dbpedia团队。

  • 尝试预处理您的数据,以便在进入处理链之前删除包含非法URI的三元组。

对于包含中文和日文字符的URI,Jena符合IRI spec,因此只要您的URI符合您的要求就可以了。