用Jena解析RDF递归

用Jena解析RDF递归,rdf,jena,Rdf,Jena,我正在尝试使用ApacheJena递归解析RDF文档。它由以下数据集组成: description: Description license: http://creativecommons.org/licenses/by/3.0/ keyword: Keyword1 distribution -> Download -> accessurl: http:/url/ distribution -> Download -> format -> IMT -> val

我正在尝试使用ApacheJena递归解析RDF文档。它由以下数据集组成:

description: Description
license: http://creativecommons.org/licenses/by/3.0/
keyword: Keyword1
distribution -> Download -> accessurl: http:/url/
distribution -> Download -> format -> IMT -> value: application/pdf
distribution -> Download -> format -> IMT -> label: pdf
...
描述 关键词1 http:/url/ 申请表格/pdf pdf 2012-11-09T16:23:22 公司 到目前为止,我已经得到了dcat:Dataset下面的每一条语句,但我想找到每一层中的每一个三元组。我的输出应该如下所示:

description: Description
license: http://creativecommons.org/licenses/by/3.0/
keyword: Keyword1
distribution -> Download -> accessurl: http:/url/
distribution -> Download -> format -> IMT -> value: application/pdf
distribution -> Download -> format -> IMT -> label: pdf
...
我用递归函数尝试过,它迭代语句,当语句不是文本时,它跟随对象到下一个节点。像这样:

私有字符串递归QueryStatement stmt{ 资源主题=stmt.getSubject; 属性谓词=stmt.getPredicate; RDFNode object=stmt.getObject; ifobject.isLiteral{ out.printlnLIT:+predicate.getLocalName; 返回object.toString; }否则{ out.printlnperedicate.getLocalName; 资源r=stmt.getResource; StmtIterator stmts=r.listProperties; 而stmts.hasNext{ 语句s=stmts.next; out.printlns.getPredicate.getLocalName; 返回递归查询; } } 返回null; } 但不知怎的,我用这种方法一事无成。
非常感谢您的每一个见解。

基于您之前链接的问题,我完成了您的数据,以便我们可以使用一些工作数据。以下是完整的数据:

描述 关键词1 http:/url/ 申请表格/pdf pdf 2012-11-09T16:23:22 公司 听起来您只是在尝试对dcat:Dataset类型的每个元素执行一次测试。这很容易做到。我们只需选择dcat:Dataset类型的每个元素,然后从该RDFNode开始深度优先搜索

导入java.util.HashSet; 导入java.util.Set; 导入com.hp.hpl.jena.rdf.model.model; 导入com.hp.hpl.jena.rdf.model.ModelFactory; 导入com.hp.hpl.jena.rdf.model.RDFNode; 导入com.hp.hpl.jena.rdf.model.Statement; 导入com.hp.hpl.jena.rdf.model.stmtilerator; 导入com.hp.hpl.jena.词汇表.RDF; 公共类DfsInrdWithJena{ 公共静态无效字符串[]args{ 模型模型=ModelFactory.createDefaultModel; model.read rdfdfs.rdf; StmtIterator stmts=model.listStatements null,RDF.type,model.getResourcehttp://www.w3.org/ns/dcat +数据集; 而stmts.hasNext{ rdfDFS stmts.next.getSubject,新哈希集; } 模型。写入系统。输出,N3; } 公共静态无效rdfDFS RDFNode节点,已访问集,字符串前缀{ 如果已访问,则包含节点{ 回来 } 否则{ 已访问。添加节点; System.out.println前缀+节点; if node.isResource{ StmtIterator stmts=node.asResource.listProperties; 而stmts.hasNext{ 语句stmt=stmts.next; rdfDFS stmt.getObject,已访问,前缀+节点+=[+stmt.getPredicate+]=>; } } } } } 这将产生以下输出:

http://url/
http://url/ =[http://purl.org/dc/terms/publisher]=> -f6d9b42:13f2e8dc5fb:-7ffd
http://url/ =[http://purl.org/dc/terms/publisher]=> -f6d9b42:13f2e8dc5fb:-7ffd =[http://purl.org/dc/terms/title]=> Company@en
http://url/ =[http://purl.org/dc/terms/publisher]=> -f6d9b42:13f2e8dc5fb:-7ffd =[http://www.w3.org/1999/02/22-rdf-syntax-ns#type]=> http://xmlns.com/foaf/0.1/Organization
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://purl.org/dc/terms/modified]=> 2012-11-09T16:23:22^^http://www.w3.or/2001/XMLSchema#date
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://purl.org/dc/terms/format]=> -f6d9b42:13f2e8dc5fb:-7ffe
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://purl.org/dc/terms/format]=> -f6d9b42:13f2e8dc5fb:-7ffe =[http://www.w3.org/2000/01/rdf-schema#label]=> pdf
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://purl.org/dc/terms/format]=> -f6d9b42:13f2e8dc5fb:-7ffe =[http://www.w3.org/1999/02/22-rdf-syntax-ns#value]=> application/pdf
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://purl.org/dc/terms/format]=> -f6d9b42:13f2e8dc5fb:-7ffe =[http://www.w3.org/1999/02/22-rdf-syntax-ns#type]=> http://purl.org/dc/terms/IMT
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://www.w3.org/ns/dcat#accessURL]=> http:/url/
http://url/ =[http://www.w3.org/ns/dcat#distribution]=> -f6d9b42:13f2e8dc5fb:-7fff =[http://www.w3.org/1999/02/22-rdf-syntax-ns#type]=> http://www.w3.org/ns/dcat#Download
http://url/ =[http://www.w3.org/ns/dcat#keyword]=> Keyword1@ca
http://url/ =[http://purl.org/dc/terms/license]=> http://creativecommons.org/licenses/by/3.0/
http://url/ =[http://purl.org/dc/terms/description]=> Description@ca
http://url/ =[http://www.w3.org/1999/02/22-rdf-syntax-ns#type]=> http://www.w3.org/ns/dcat#Dataset
它不如您描述的输出漂亮,但似乎正是您想要的

关于RDF作为图表示的注记 这个问题使用了符号“每条语句,都在dcat:Dataset的正下方”,我认为值得指出的是,为了防止混淆,RDF是一种基于图形的表示。的确,RDF/XML序列化可以用来提供一些结构良好的、人类可读的XML,但是并不需要XML表示具有这种结构。要查看这一差异,请注意,下面的RDF/XML表示与本答案前面发布的图相同的图形

2012-11-09T16:23:22 http:/url/ 关键词1 描述 公司 pdf 申请表格/pdf
RDF图是完全相同的,尽管XML结构非常不同。我提出这一点只是为了强调这样一个事实,即将RDF作为一个图形而不是分层XML来使用确实很重要,即使特定的序列化可能表明我们可以使用后者。

您能解释一下您当前的代码走了多远吗?你看到了什么?基本上我只是得到了文字描述的值
正确的输入和关键字。但是Java代码的输出是:publisher homepage homepage distribution modified LIT:modified LIT:keyword LIT:keyword license LIT:description Type等等:你从来没有打印过“r”,是吗?您需要一些类似于if r.isURIResource{out.printlnURI+r.getURI;}的内容,这是真的。但我想这还不是重点。我要说的是,我浏览这些声明的整个算法到目前为止都不正确。再次感谢你,约书亚。谢谢你的详细见解。事实上,我知道RDF代表一个图。因此,我试图像递归一样遍历它。但不知何故,我正在为Jena和RDF syntac以及语言概念而挣扎。