使用 Jena 解析 RDF 递归

2024-02-28

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

<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:Dataset 正下方的每一条语句(使用 Jena 迭代 RDF 文件中的特定资源 https://stackoverflow.com/questions/16939159/iterate-over-specific-resource-in-rdf-file-with-jena),但我想找到每个级别中的每个三元组。我的输出应该如下所示:

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
...

我已经用递归函数尝试过,该函数迭代语句,当语句不是文字时,它会跟随对象到达下一个节点。像这样:

private String recursiveQuery(Statement stmt) {
    Resource subject = stmt.getSubject();
    Property predicate = stmt.getPredicate();
    RDFNode object = stmt.getObject();

    if(object.isLiteral()) {
        out.println("LIT: " + predicate.getLocalName());
        return object.toString();

    } else {
        out.println(predicate.getLocalName());
        Resource r = stmt.getResource();
        StmtIterator stmts = r.listProperties();
        while (stmts.hasNext()) {
            Statement s = stmts.next();
            out.println(s.getPredicate().getLocalName());
            return recursiveQuery(s);
        }
    }
    return null;

}

但不知怎的,我用这种方法毫无进展。 非常感谢您的每一个见解。


根据您链接到的先前问题,我完成了您的数据,以便我们有一些工作数据可供使用。这是完成的数据:

<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>

听起来你只是想做一个深度优先搜索 http://en.wikipedia.org/wiki/Depth_first_search在类型的每个元素上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 表示the same图表如本答案之前发布的图表。

<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>

The RDF图是完全相同的,尽管XML结构是非常不同的。我提出这一点只是为了强调使用 RDF 确实很重要这一事实作为图表,而不是分层 XML,即使特定的序列化可能表明我们可以使用后者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jena 解析 RDF 递归 的相关文章

  • 比较 SPARQL 图

    如何使用 SPARQL 比较两个 RDF 图 如果我有图表 a 和 b 我想找到 a 出现在 b 中的所有时间 我可以查询 a 的所有主语 谓词和宾语 然后以编程方式构建一个与 b 中的 a 模式匹配的模式查询 有没有一种方法可以在 SPA
  • OWL/XML 读取问题

    我在使用 Jena 从 Java 读取 OWL XML 文件时遇到问题 我读取 RDF XML 文件没有问题 但每当我从 Protege 创建 OWL XML 文件并尝试读取它时 Java 都会给出以下错误 警告 主要 RDFDefault
  • 解析模型后,Redland RDF 中 RDF 节点的生命周期?

    我正在解析 RDF model 使用librdf parser parse string into model 然后我保留librdf model但释放librdf parser 在我看来 模型中的节点似乎也消失了 那么一生会做什么雷德兰R
  • 仅当对象是文字时才按语言过滤

    我写了以下查询 SELECT DISTINCT predicate object label WHERE VALUES subject
  • rdf:Bag、rdf:Seq 和 rdf:Alt 在使用时有何不同?

    我正在读RDF 模式 1 1 http www w3 org TR rdf schema ch bag建议 其中包括以下内容 强调是后加的 5 1 2 rdf 袋子 http www w3 org TR rdf schema ch bag
  • 将 CSV 转换为 RDF,其中一列是一组值

    我想将 CSV 转换为 RDF 事实上 该 CSV 的一列是一组用分隔符 在我的例子中为空格符 连接的值 以下是 CSV 示例 带标题 col1 col2 col3 A B C D John M X Y Z Jack 我希望转换过程创建一个
  • 使用 SPARQL 仅对一个值进行 DISTINCT

    我想使用 SPARQL 检索人口超过 10 万的意大利城市列表 我使用以下查询 PREFIX dbo
  • 使用 Jena 解析 RDF 递归

    我正在尝试使用 Apache Jena 递归解析 RDF 文档 它由如下数据集组成
  • 禁用 apache.http.wire 调试日志

    我正在将 Travis CI 与我的 github 存储库 java 项目 一起使用 我的一项测试使用 SPARQL 和 Jena 从 Dbpedia 获取数据 它导致我在日志中将许多记录打印到 Travis 输出中 从而导致 Travis
  • 在 OWL 中的同一属性中定义多个域/范围

    在 OWL 中设置数据 对象属性的域 范围的正确方法是什么 如果我有两节课A B和数据属性hasName
  • RDF 文件转换为 Excel 可读格式

    我下载了 ttl 格式的 rdf 文件 我是 RDF 新手 我想看看是否可以以某种简单的 txt csv 格式获取数据 有谁知道如何做到这一点 RDF 有一个非常简单的数据模型 它只是subject predicate object 您可以
  • Jena PrefixMapping:当模型是从数据集中获取的命名模型时,基本命名空间缺失

    这是我用来加载的代码OntModel to a Dataset作为命名模型 然后我尝试检索PrefixMapping以两种不同的方式实现相同的目的 public static void loadDatasetwithNamedModels
  • Jena 桌面 SPARQL 客户端 (TDB)?

    我正在开发一个使用 Jena 进行存储 带有 TDB 后端 的应用程序 我正在寻找类似 Squirrel 的东西 它可以让我看到正在存储的内容 运行查询等 这似乎是一个明显需要的东西 但我的 可能措辞不好 谷歌查询没有出现任何有希望的东西
  • RDF和OWL工作流程问题

    我一直在通过 Protege 查看和使用 OWL 我想知道我是否正确理解 工作流程 和它的想法 从头开始构建数据库 使用 Protege 或等效工具为您的数据生成 OWL 本体 将此模式导出为 RDF 使用定义为三元组中的某些元素的类以及目
  • SPARQL - 查找具有最相似属性的对象

    假设有一个人的 RDF 数据库 每个人都有许多三元组来定义这个人的朋友 这么多 person x hasFriend otherPerson 如何找到拥有最相似朋友的人 我是 SPARQL 的新手 这似乎是一个非常复杂的查询 基本上 结果将
  • W3C 验证器无法处理 RDF/XML

    我正在尝试描述一个非常基本的地铁火车站地图 其中包含站点和时间 这个 RDF 到 Turtle 转换器 http rdf translator appspot com 可以解析我的 XML 但 W3C 验证器抛出 Error Your do
  • 在构建语义 Web 应用程序时,OWL 是如何实际使用的?

    我一直在阅读有关语义 Web 技术 例如 RDF 和 OWL 的内容 并且对在现有关系数据库之上构建 RDF 三重存储语义数据库的可能性很感兴趣 这只是一项研发活动 看看我能做什么 我喜欢的样子OWLIM http www ontotext
  • 来自 WEBVTT 的 RDF/JSON Javascript 解析器

    晚上好 开门见山 我需要一个脚本来从 WEBVTT 文件中的特定时间间隔获取 RDF JSON 结构 这样的事情存在吗 RDF JSON 是 Talis 指定的文件结构 如下所示 S P O WEBVTT 实现上述结构如下 0 00 00
  • 通过SPARQL UPDATE从本体中删除空白节点

    我在 SPARQL UPDATE 插入 操作的帮助下将一些数据存储在 protege 中制作的本体模型中 以下是更新查询 PREFIX test
  • 将 SWRL 与 Jena 和 Pellet 结合使用

    我无法找到一些使用 SWRL 和 Jena 的简单代码示例 佩莱 或者至少使用 SWRL 我研究了 Pellet 文档中的一些示例 但没有关于使用 SWRL 的示例 网络上的大多数示例都不完整且令人困惑 我找到的唯一解决方案是使用 Jess

随机推荐