本文介绍了SPARQL DELETE查询dotNetRDF不修改RDF文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我喜欢使用dotNetRDF从RDF文件中删除RDF元组。以下是我使用的代码
public void deleteDest(string destID)
{
TripleStore store = new TripleStore();
Graph rdf = new Graph();
FileLoader.Load(rdf, rdfFilePath, new RdfXmlParser());
store.Add(rdf);
SparqlUpdateParser parser = new SparqlUpdateParser();
SparqlParameterizedString cmdString = new SparqlParameterizedString();
cmdString.CommandText = "PREFIX j.0: <http://www.example.org/destDetails#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "DELETE "
+ "WHERE { "
+ " ?dest j.0:ID "" + destID + "" "
+ "}";
SparqlUpdateCommandSet cmds = parser.ParseFromString(cmdString);
LeviathanUpdateProcessor processor = new LeviathanUpdateProcessor(store);
processor.ProcessCommandSet(cmds);
rdf.SaveToFile(rdfFilePath);
}
以下是我的RDF文件的结构
<rdf:RDF xml:base="http://www.example.org/destDetails#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:ns0="http://www.example.org/destDetails#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="&ns0;0165a659-54ea-4e80-bee7-9d3951d47ae3">
<ns0:ID>0165a659-54ea-4e80-bee7-9d3951d47ae3</ns0:ID>
<ns0:destination rdf:resource="&ns0;VELES" />
<ns0:distrName>Test Test</ns0:distrName>
<ns0:hasTimeStart>17:00</ns0:hasTimeStart>
<ns0:hasTimeStop>17:55</ns0:hasTimeStop>
<ns0:moneyOneDir>130 den.</ns0:moneyOneDir>
<ns0:moneyTwoDir>---</ns0:moneyTwoDir>
</rdf:Description>
</rdf:RDF>
但是,不会对RDF文件应用任何更改。
推荐答案
问题是您的更新在默认图形上操作,但您的数据集只包含命名图形。
FileLoader.Load(rdf, rdfFilePath, new RdfXmlParser());
store.Add(rdf);
当您执行上述操作时,这会将数据加载到您的图表中,并根据数据源为该图表指定一个名称-在您的示例中,它将获得一个file://
URI。然后,当您将其添加到存储区时,存储区使用图形的当前名称(来自图形的BaseUri
属性),并将其添加为命名图形。但是,您的DELETE
仅引用在您的示例中为空的缺省图,并且您命名的图不会以任何方式修改。有几种不同的方法可以解决此问题。1-显式构造数据集
您可以指定将命名图形视为默认图形,如下所示:
// Create a dataset and use the named graph as the default graph
InMemoryDataset ds = new InMemoryDataset(store, rdf.BaseUri);
// Use the dataset to create the processor
LeviathanUpdateProcessor processor = new LeviathanUpdateProcessor(ds);
2-将命名图形添加为默认图形
您可以通过在将命名图形添加到存储区之前删除其名称,使其被视为默认图形:
FileLoader.Load(rdf, rdfFilePath, new RdfXmlParser());
rdf.BaseUri = null; // Remove the name from the graph
// If the graph has no name it is added as the default graph
store.Add(rdf);
3-重写您的更新
您可以重写DELETE
以显式引用命名图:
cmdString.CommandText = @"PREFIX j.0: <http://www.example.org/destDetails#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
DELETE WHERE
{
GRAPH @graph { ?dest j.0:ID @destID }
}";
cmdString.SetUri("graph", rdf.BaseUri);
cmdString.SetLiteral("destID", destID);
请注意,我将verbatim string literals用于可读性,并通过SetUri()
和SetLiteral()
而不是字符串连接来注入参数。
这篇关于SPARQL DELETE查询dotNetRDF不修改RDF文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!