【发布时间】:2011-10-03 04:57:15
【问题描述】:
我想在我的 RDF 文件中插入一个节点。我知道有 SPARQL 插入/更新语法,但是如何使用 Jena 来做到这一点。一个例子会很有用。
【问题讨论】:
-
我和你在一起。例子很模糊。
我想在我的 RDF 文件中插入一个节点。我知道有 SPARQL 插入/更新语法,但是如何使用 Jena 来做到这一点。一个例子会很有用。
【问题讨论】:
您确定需要使用 SPARQL 更新吗?在 Jena 中,节点(资源或文字)本身并不在 Model 中,而只是因为它是模型中的三元组(即 Statement)的一部分。如果您的代码中有Model 对象,请使用addStatement 的众多变体之一将给定的资源或文字添加到您的图表中。
在您的评论澄清您要添加到磁盘上的文件后,您可以按照 RobV 所说的操作并修改内存中的Model,然后再次将其写出。这确实是正确的方法。但是,有一个快速而简单的解决方法可能对您有所帮助。如果您的文件是Turtle 或N-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 文件的末尾是一种有效且有用的技术。
【讨论】:
试试这个
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");
【讨论】:
使用 ARQ(Jena 的 SPARQL 处理器库)UpdateFactory 创建更新,然后使用 UpdateExecutionFactory 创建可以评估更新的 UpdateProcessor。
它比这稍微复杂一些,因为您还需要一个数据集来评估更新。老实说,我不知道从单个模型创建数据集有多容易,但无法想象有那么困难
【讨论】:
Model 加载到内存中,然后从中创建一个数据集并对其应用 SPARQL 更新,然后再次将其保存回文件。正如 Ian 的回答所暗示的那样,如果您的更改很简单,那么使用模型 API 方法(如 addStatement())可能会比使用 SPARQL 更新更容易