SPARQL删除查询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()而不是字符串连接注入参数.

https://stackoverflow.com/questions/18173387/sparql-delete-query-dotnetrdf-does-not-modify-rdf-file

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:SPARQL删除查询dotNetRDF不会修改RDF文件