根据您之前链接到的问题,我完成了您的数据,以便我们可以使用一些工作数据。这是完成的数据:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcat="http://www.w3.org/ns/dcat#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:dct="http://purl.org/dc/terms/"
xmlns:dctypes="http://purl.org/dc/dcmitype/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<dcat:Catalog rdf:about="http://uri/">
<dcat:dataset>
<dcat:Dataset rdf:about="http://url/" >
<dct:description xml:lang="ca">Description</dct:description>
<dct:license rdf:resource="http://creativecommons.org/licenses/by/3.0/"/>
<dcat:keyword xml:lang="ca">Keyword1</dcat:keyword>
<dcat:distribution>
<dcat:Download>
<dcat:accessURL>http:/url/</dcat:accessURL>
<dct:format>
<dct:IMT>
<rdf:value>application/pdf</rdf:value>
<rdfs:label>pdf</rdfs:label>
</dct:IMT>
</dct:format>
<dct:modified rdf:datatype="http://www.w3.or/2001/XMLSchema#date">2012-11-09T16:23:22</dct:modified>
</dcat:Download>
</dcat:distribution>
<dct:publisher>
<foaf:Organization>
<dct:title xml:lang="en">Company</dct:title>
<foaf:homepage rdf:resource="http://url/"/>
</foaf:Organization>
</dct:publisher>
</dcat:Dataset>
</dcat:dataset>
</dcat:Catalog>
</rdf:RDF>
听起来您只是想对type 的每个元素进行深度优先搜索dcat:Dataset
。这很容易做到。我们只需选择每个 type 元素,dcat:Dataset
然后从中开始深度优先搜索RDFNode
。
import java.util.HashSet;
import java.util.Set;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.RDF;
public class DFSinRDFwithJena {
public static void main(String[] args) {
Model model = ModelFactory.createDefaultModel();
model.read( "rdfdfs.rdf" );
StmtIterator stmts = model.listStatements( null, RDF.type, model.getResource( "http://www.w3.org/ns/dcat#" + "Dataset" ));
while ( stmts.hasNext() ) {
rdfDFS( stmts.next().getSubject(), new HashSet<RDFNode>(), "" );
}
model.write( System.out, "N3" );
}
public static void rdfDFS( RDFNode node, Set<RDFNode> visited, String prefix ) {
if ( visited.contains( node )) {
return;
}
else {
visited.add( node );
System.out.println( prefix + node );
if ( node.isResource() ) {
StmtIterator stmts = node.asResource().listProperties();
while ( stmts.hasNext() ) {
Statement stmt = stmts.next();
rdfDFS( stmt.getObject(), visited, prefix + node + " =[" + 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 表示与此答案前面发布的图表相同的图表。
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcat="http://www.w3.org/ns/dcat#"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:dct="http://purl.org/dc/terms/"
xmlns:dctypes="http://purl.org/dc/dcmitype/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" >
<rdf:Description rdf:nodeID="A0">
<dct:modified rdf:datatype="http://www.w3.or/2001/XMLSchema#date">2012-11-09T16:23:22</dct:modified>
<dct:format rdf:nodeID="A1"/>
<dcat:accessURL>http:/url/</dcat:accessURL>
<rdf:type rdf:resource="http://www.w3.org/ns/dcat#Download"/>
</rdf:Description>
<rdf:Description rdf:about="http://uri/">
<dcat:dataset rdf:resource="http://url/"/>
<rdf:type rdf:resource="http://www.w3.org/ns/dcat#Catalog"/>
</rdf:Description>
<rdf:Description rdf:about="http://url/">
<dct:publisher rdf:nodeID="A2"/>
<dcat:distribution rdf:nodeID="A0"/>
<dcat:keyword xml:lang="ca">Keyword1</dcat:keyword>
<dct:license rdf:resource="http://creativecommons.org/licenses/by/3.0/"/>
<dct:description xml:lang="ca">Description</dct:description>
<rdf:type rdf:resource="http://www.w3.org/ns/dcat#Dataset"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A2">
<foaf:homepage rdf:resource="http://url/"/>
<dct:title xml:lang="en">Company</dct:title>
<rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Organization"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A1">
<rdfs:label>pdf</rdfs:label>
<rdf:value>application/pdf</rdf:value>
<rdf:type rdf:resource="http://purl.org/dc/terms/IMT"/>
</rdf:Description>
</rdf:RDF>
RDF 图完全相同,尽管XML结构非常不同。我提出这个只是为了强调一个事实,即使用 RDF作为图形而不是分层 XML确实很重要,即使特定的序列化可能表明我们可以使用后者。