SPARQL-запрос на удаление dotNetRDF не изменяет файл RDF
Мне нравится удалять кортеж RDF из файла RDF с помощью dotNetRDF. Вот код, который я использую
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.
2 ответа
Проблема в том, что ваше обновление работает с графиком по умолчанию, но набор данных содержит только именованный график.
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);
Обратите внимание, что для удобства чтения я использовал дословные строковые литералы и вводил параметры через SetUri()
а также SetLiteral()
вместо конкатенации строк.
Есть дополнительное место \"" + destID + "\" "
(отмечено X -> \"" + destID + "\"X")