我从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吗?
答案 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符合您的要求就可以了。