【问题标题】:SPARQL delete query dotNetRDF does not modify RDF fileSPARQL 删除查询 dotNetRDF 不修改 RDF 文件
【发布时间】:2013-08-11 15:15:31
【问题描述】:

我喜欢使用 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 文件应用任何更改。

【问题讨论】:

  • 看起来您正在将模型写入磁盘,这很好,我怀疑问题不存在。您可以将模型打印到标准输出而不是将其写入磁盘吗?我希望您:没有传递您期望的 destID,或者它是一个类型化的文字,因此您需要实际使用 ?dest j.0:ID "..."^^xsd:string
  • 我想文字不是问题,因为在我用于 SELECT SPARQL 的方法中作为输入参数的相同 destID 并正在返回结果
  • 即使文本形式相同,如果插入它会导致将 typed 文字插入到图形中,然后尝试删除 untyped 文字不会删除插入的三元组。很容易测试;只需将^^xsd:string 添加到您的 SPARQL 查询中,看看结果是否会改变。
  • 我试过了但是rdf文件还是没有修改
  • 嗯……如果您尝试保存到新文件(即不同的路径),结果如何?

标签: sparql dotnetrdf


【解决方案1】:

问题是您的更新在默认图上运行,但您的数据集仅包含命名图。

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() 注入参数,而不是字符串连接。

【讨论】:

  • 这段代码抛出 URI 不能为空异常。我把 rdf.BaseUri = new Uri("example.org/destDetails") 和代码删除了元组 j.0:ID 属性。我想删除整个 rdf:about 元组的所有属性。你能给我一些想法吗?跨度>
  • 哪个代码?如果BaseUrinull,那么cmd.SetUri() 将给出该错误。
  • 如果您想删除与您识别的三元组相关的所有三元组,请将?dest ?p ?o 作为附加三元组模式添加到您的DELETE
  • cmd.SetUri() 给出 URI 不能为空异常
  • @vikifor 如果您不了解如何编写 SPARQL 更新来实现您的目标,那么这是一个与您在 dotNetRDF 中遇到的问题无关的单独问题,应该作为一个新问题提出
【解决方案2】:

有一个额外的空格\"" + destID + "\" "(标有X --> \"" + destID + "\"X")

【讨论】:

  • 我试过没有多余的空格。文件没有修改。
  • 正如我在 answers.semanticweb.com//questions/24051/…> 中指出的那样——多余的空格位于结束 destID 值/字符串的引号之后,以及右大括号“}”之前。这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多