我正在尝试使用jena arq使用SPARQL更新查询更新本地rdf文件。以下是代码
GraphStore graphstore = GraphStoreFactory.create();
UpdateRequest req = UpdateFactory.create();
req.add(" PREFIX : myprefixuri INSERT DATA { GRAPH file:///path-to-file/file.n3 { :person :name 'xyz'. } } ");
UpdateAction.execute(req, graphstore);
执行代码后,它声明查询已成功执行,但本地文件未更新。
我认为您的混淆是由于使用文件名作为图形名称而引起的:
INSERT DATA { GRAPH file:///path-to-file/file.n3
这不会将数据插入到名为 file.n3
的文件中,而是将其插入名为 file:///path-to-file/file.n3
的图形中。该图形将位于图形存储创建它的位置,当您设置它时,它将是一个内存中的对象。为了使更新持久化,您需要使用管理持久图的图形库,例如使用TDB,或者需要在更新后将图形写入磁盘。我猜你想要后者。
写出RDF目前在Model
上使用API方法,这是底层Jena Graph
对象的门面,但具有额外的便利功能,包括I/O。因此,您需要从图形存储中获取对图形的引用,将其包装为模型,然后将其写出来。警告 - 未经测试的代码:
Node graphName = Node.createURI( "file:///path-to-file/file.n3" );
Graph g = graphstore.getGraph( graphName );
Model m = ModelFactory.createModelForGraph( g );
g.write( new FileWriter("/path-to-file/file.n3"), "Turtle" );
您已经创建了一个商店并将文件上传到其中,然后通过您的商店执行了更新。因此,您的商店已成功更新,但您尚未将商店内容导出回文件。