我想在我的RDF文件中插入一个节点。我知道有SPARQL插入/更新语法,但如何使用Jena执行此操作。一个例子将非常有用。
答案 0 :(得分:3)
您确定需要使用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
文件的末尾是一种有效且有用的技术。
答案 1 :(得分:1)
试试这个
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");
答案 2 :(得分:0)
使用ARQ(Jena的SPARQL处理器库)UpdateFactory创建更新,然后使用UpdateExecutionFactory创建可以评估更新的UpdateProcessor。
它比这更复杂,因为您还需要一个数据集来评估更新。老实说,我不知道从单个模型创建数据集是多么容易,但无法想象它是那么困难