【问题标题】:Delete RDF tuple using dotNetRDF [duplicate]使用 dotNetRDF 删除 RDF 元组 [重复]
【发布时间】:2013-08-15 17:13:46
【问题描述】:

我想使用 dotNetRDF 删除一个 RDF 元组。这是我的 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>

这是我正在使用的代码:

        TripleStore magacinTorki = new TripleStore();
        //kreiranje na graf
        Graph rdf = new Graph();
        // Create a dataset and use the named graph as the default graph
        FileLoader.Load(rdf, rdfDatoteka, new RdfXmlParser());
        rdf.BaseUri = new Uri("http://www.example.org/destDetails"); // Remove the name from the graph
        // If the graph has no name it is added as the default graph
        magacinTorki.Add(rdf);
        SparqlUpdateParser parser = new SparqlUpdateParser();
        SparqlParameterizedString cmdString = new SparqlParameterizedString();

        cmdString.CommandText = @"PREFIX  ns0: <http://www.example.org/destDetails#>"
            + " PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
            + " DELETE "
            + " WHERE  {"
            + " GRAPH @graph {  ?dest ?p ?o"
            + " ?dest ns0:nodeID @destID} }";

        cmdString.SetUri("graph",rdf.BaseUri);
        cmdString.SetLiteral("destID",destID);
        SparqlUpdateCommandSet cmds = parser.ParseFromString(cmdString);
        LeviathanUpdateProcessor processor = new LeviathanUpdateProcessor(magacinTorki);
        processor.ProcessCommandSet(cmds);
        rdf.SaveToFile(rdfDatoteka);

但是 RDF 文件没有发生任何事情。


这段代码对我来说很好用,因为我没有被要求使用 SPARQL 删除三元组

        Graph rdf = new Graph();
        // Create a dataset and use the named graph as the default graph
        FileLoader.Load(rdf, rdfDatoteka, new RdfXmlParser());
        rdf.BaseUri = new Uri("http://www.example.org/destDetails");
        INode n = rdf.GetUriNode(new Uri("http://www.example.org/destDetails#" + destID));
        if (n != null)
        {
            rdf.Retract(rdf.GetTriplesWithSubject(n));
        }
        rdf.SaveToFile(rdfDatoteka);

其中destID 是所有三元组的主题。

【问题讨论】:

  • 在@RobV 的answer to the previous question 中,您不接受哪些不起作用?这看起来像同一个问题。他确实评论了“如果您不了解如何编写 SPARQL 更新来实现您的目标,那么这是一个与此问题无关的单独问题”,但这看起来像是同一个问题。
  • 我喜欢删除元组和元组本身的所有属性。 RobV 答案仅删除 nodeID 属性。
  • 他在a comment 中说,“如果您想删除与您识别的三元组相关的所有三元组,请将?dest ?p ?o 作为附加三元组模式添加到您的DELETE”。
  • 另外,关于术语的注释:一般来说,三元组(即 3 元组)没有属性。每个三元组都有 {subject predicate object} 的形式。在您的数据中,您有七个三元组(让 X 代表节点): {X ID ...}; {X 目的地…}; {X distrName "测试测试"};等等。每个三元组 {X p o} 可以被视为说明“X 对于属性 p 具有值 o”。听起来您只想删除所有断言 X 属性的三元组,@RobV 之前的评论解释了如何做。

标签: rdf sparql dotnetrdf


【解决方案1】:

您的查询实际上与您的数据不匹配,这就是您的DELETE 无效的原因。

在您的数据中,您有 ns0:ID,但在您的 DELETE 中,您尝试匹配 ns0:nodeID - 因此不会匹配任何数据,也不会删除任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多