【问题标题】:How to insert/update an RDF file using Jena?如何使用 Jena 插入/更新 RDF 文件?
【发布时间】:2011-10-03 04:57:15
【问题描述】:

我想在我的 RDF 文件中插入一个节点。我知道有 SPARQL 插入/更新语法,但是如何使用 Jena 来做到这一点。一个例子会很有用。

【问题讨论】:

  • 我和你在一起。例子很模糊。

标签: rdf sparql jena


【解决方案1】:

您确定需要使用 SPARQL 更新吗?在 Jena 中,节点(资源或文字)本身并不在 Model 中,而只是因为它是模型中的三元组(即 Statement)的一部分。如果您的代码中有Model 对象,请使用addStatement 的众多变体之一将给定的资源或文字添加到您的图表中。

附录

在您的评论澄清您要添加到磁盘上的文件后,您可以按照 RobV 所说的操作并修改内存中的Model,然后再次将其写出。这确实是正确的方法。但是,有一个快速而简单的解决方法可能对您有所帮助。如果您的文件是TurtleN-Triples 格式,您可以只追加到文件的末尾(显然,您不能在XML 中这样做)。所以大致如下:

File f = new File( "where.your.file.is" );
FileOutputStream out = new FileOutputStream( f, true );
out.write( ":john :loves :jane.\n" );
out.close();

会工作的。不建议这样做,因为您冒着以下风险:(a) 没有正确的命名空间前缀,(b) 引入语法错误(因为您没有使用 Jena 编写器),以及 (c) 创建重复的三元组,但是有时它是在紧要关头的有用技巧。显然,您只能使用这种技术添加信息,而不能更新或删除现有的三元组。

在从正在进行的日志记录或监控应用程序收集大量数据时,直接附加到 N-triples 文件的末尾是一种有效且有用的技术。

【讨论】:

    【解决方案2】:

    试试这个

       Model m = ModelFactory.createDefaultModel();
            m.read("/Users/heshanjayasinghe/Documents/A-enigmaProject/jena_Enigma/src/jena_enigma/Enigma.RDF", "RDF/XML");
            String NS="http://www.heshjayasinghe.webatu.com/Enigma.RDF#";
    
            Resource r = m.createResource(NS+"user8");//like subject
            Property p1 =m.createProperty(NS+"lname");
            Property p2 =m.createProperty(NS+"email");
            Property p3 =m.createProperty(NS+"fname");
            Property p4 =m.createProperty(NS+"password");
    
    
            r.addProperty(p1, "thathasara", XSDDatatype.XSDstring);
            r.addProperty(p2, "nt@gmail.com", XSDDatatype.XSDstring);
            r.addProperty(p3, "nipun", XSDDatatype.XSDstring);
            r.addProperty(p4, "t123", XSDDatatype.XSDstring);
          //   m.write(System.out,"thurtle");
              m.write(new FileOutputStream("/Users/heshanjayasinghe/Documents/A-enigmaProject/jena_Enigma/src/jena_enigma/Enigma.RDF"), "RDF/XML");
    

    【讨论】:

    • 这段代码是更新原来的rdf文件还是新建一个rdf文件?
    【解决方案3】:

    使用 ARQ(Jena 的 SPARQL 处理器库)UpdateFactory 创建更新,然后使用 UpdateExecutionFactory 创建可以评估更新的 UpdateProcessor

    它比这稍微复杂一些,因为您还需要一个数据集来评估更新。老实说,我不知道从单个模型创建数据集有多容易,但无法想象有那么困难

    【讨论】:

    • 感谢 RobV 的回复。实际上,我担心的是我只有一个 rdf 文件,没有任何数据存储,所以可以插入该文件吗?
    • 是的,您要做的是将该文件作为 Jena Model 加载到内存中,然后从中创建一个数据集并对其应用 SPARQL 更新,然后再次将其保存回文件。正如 Ian 的回答所暗示的那样,如果您的更改很简单,那么使用模型 API 方法(如 addStatement())可能会比使用 SPARQL 更新更容易
    • 链接开始失效:(,我导致同样的问题,但我使用jena 3.1
    • 我已经修复了适用于当前 Jena 的链接,谷歌搜索给出的类名会有那么难吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多