-2

我有一个项目,我需要解析一个 RDF 文件并记录我之后必须搜索特定数据的所有数据。我在网上搜索,我能找到的只是如何查询上述 RDF 文件,但我想解析它并将所有类保存在对象中。

这是一个类在我的文件中的外观:

<BFO rdf:about="BFO:0000007">
    <rdfs:label>process</rdfs:label>  
    <Definition>  
        <rdf:Description>  
            <def>A process is an entity that exists in time by occurring or happening, has temporal parts and always involves and depends on some entity during the time it occurs.</def>  
        </rdf:Description>  
    </Definition>  
    <is_a rdf:resource="EFO:0000001"/>  
</BFO>  

更新:

是的,你说的一切都有效,非常感谢你,但最后一个问题:) 我拥有的命名空间是:

<?xml version='1.0' encoding='UTF-8'?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns="http://www.ebi.ac.uk/efo/">
</rdf>

我的问题是

        <Definition>
        <rdf:Description>
        <def>smth here</def>
        </rdf:Description>
    </Definition>  


i couldn't find a way to get the def tag, any idea how i can access it? sry to bother again:)  
4

1 回答 1

3

Jena 使用该Model对象存储已从外部源(例如文件或 Web URL)解析的 RDF。根据您项目的需要和数据的大小,您可以选择将文件读入内存Model还是持久化Model。内存通常访问速度更快,但是当然,一旦您的程序退出,内存模型的内容就会丢失(好吧,除非您再次将它们写入文件)。

您应该阅读Jena 教程以更好地了解所涉及的过程,但是将文件读入 Jena 内存模型非常容易:

String source = ".. your file location ..";
Model m = FileManager.get().loadModel( source, "RDF/XML" );

如果持久模型更适合您的项目,最好的选择是 Jena TDB。同样,很容易获得可以开始查询的模型。

你还问:

并将所有类保存在对象中

我不太清楚你在这里的意思。可能您正在考虑某种 ORM 工具,类似于 ActiveRecord?Jena 没有任何内置功能可以做到这一点,尽管已经有各种其他项目正在考虑做类似 ORM 层的事情。我不确定它们中的哪一个当前处于活动状态。但是您不需要 ORM 来访问资源的属性,您可以使用 Jena API:

String namespace = ".. your namespace here ..";
Resource bfo = m.getResource( namespace + "BFO:0000007" );
Property definition = m.getProperty( namespace + "Definition" );
RDFNode def = bfo.getProperty( definition ).getObject();

更新

好的,作为对评论的回应:如果您不知道资源上的哪些属性,您可以列出它们:

String namespace = ".. your namespace here ..";
Resource bfo = m.getResource( namespace + "BFO:0000007" );
for (StmtIterator i = bfo.listProperties(); i.hasNext(); ) {
  Statement smt = i.next();
  System.out.println( "Resource " + stmt.getSubject().getURI() + 
                      " has property " + stmt.getPredicate().getURI() +
                      " with value " + stmt.getObject() );
}

这只是一个非常简单的循环,您会想做一些更有用的事情,但希望这表明您仍然可以处理模型中的资源,而无需提前知道它们的属性。当然,在您的代码中的某个时刻,您必须将特定属性连接到您的应用程序想要对资源的特定值执行的任何操作。因此,在某个地方,您的代码必须对期望的属性有所了解。

重新阅读您的评论,我注意到您指的是“本体中的概念”(即使您在问题中引用的 RDF 片段中没有类)。您可能会发现Jena 本体 API的功能很有用,它可以列出模型中的本体类、已定义的属性等。

于 2013-05-13T08:45:02.943 回答