Удалить кортеж RDF с помощью dotNetRDF

Я хочу удалить кортеж RDF с помощью dotNetRDF. Вот мой 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 — субъект всех троек.


person vikifor    schedule 15.08.2013    source источник
comment
Что не сработало в ответе @RobV на предыдущий вопрос, который вы не приняли? Это похоже на тот же вопрос. Он сделал комментарий. Если вы не понимаете, как написать обновление SPARQL для достижения своей цели, то это отдельный вопрос, не связанный с этой проблемой, но это похоже на тот же вопрос.   -  person Joshua Taylor    schedule 15.08.2013
comment
Мне нравится удалять все свойства кортежа и сам кортеж. Ответ RobV удаляет только свойство nodeID.   -  person vikifor    schedule 15.08.2013
comment
Он сказал в комментарии, Если вы хотите удалить все тройки, связанные с идентифицированной вами тройкой, добавьте ?dest ?p ?o в качестве дополнительного шаблона тройки к вашему DELETE.   -  person Joshua Taylor    schedule 15.08.2013
comment
Кроме того, замечание по терминологии: вообще говоря, тройки (т. е. тройки) не имеют свойств. Каждая тройка имеет форму {подлежащее предикат объект}. В ваших данных у вас есть семь троек (где X обозначает узел): {X ID…}; {Х пункт назначения…}; {X distrName Test test}; и так далее. Каждая тройка {X p o} может рассматриваться как утверждение, что X имеет значение o для свойства p. Похоже, вы просто хотите удалить все триплеты, которые утверждают свойства X, что объяснялось в предыдущем комментарии @RobV, как это сделать.   -  person Joshua Taylor    schedule 15.08.2013


Ответы (1)


Ваш запрос на самом деле не соответствует вашим данным, поэтому ваш DELETE не действует.

В ваших данных у вас есть ns0:ID, но в ваших DELETE вы пытаетесь сопоставить с ns0:nodeID - поэтому никакие данные не будут сопоставляться и ничего не будет удалено.

person RobV    schedule 15.08.2013