我正在使用dotnetrdf根据从Windows应用程序表单中的文本框中获取的数据属性来删除个人。我在此表单中阅读了有关删除查询的先前问题,并对我的代码进行了更改,但它既没有出错也没有更改本体。
这是使用
的代码public void deleteActuator(int actuatorCode)
{
TripleStore store = new TripleStore();
Graph mygraph = new Graph();
FileLoader.Load(mygraph, "D:/Masters
Studies/Ontology/Providers/Actuator/ActuatorProvider.owl", new RdfXmlParser());
mygraph.BaseUri = null;
store.Add(mygraph);
SparqlUpdateParser myparser = new SparqlUpdateParser();
SparqlParameterizedString querystring = new SparqlParameterizedString();
querystring.CommandText = "PREFIX AP0:
<http://www.semanticweb.org/faiza/ontologies/2014/10/ActuatorProvider#> " +
"PREFIX rdf: <>" +
"PREFIX owl: <>" +
"PREFIX xsd: <>" +
"PREFIX rdfs: <>" +
"DELETE " +
"WHERE { ?code AP0:ActuatorCode " + actuatorCode + "}";
SparqlUpdateCommandSet cmds = myparser.ParseFromString(querystring);
LeviathanUpdateProcessor processor = new LeviathanUpdateProcessor(store);
processor.ProcessCommandSet(cmds);
mygraph.SaveToFile("D:/Masters
Studies/Ontology/Providers/Actuator/ActuatorProvider.owl");
}
任何人都可以指出我的错误。这是我的猫头鹰文件
<owl:NamedIndividual rdf:about="&ActuatorProvider;ActuatingDevice1">
<ace_lexicon:PN_sg>ActuatingDevice1</ace_lexicon:PN_sg>
<ActuatorProvider:ActuatorExplain rdf:datatype="&xsd;string">"TemperatureControl"</ActuatorProvider:ActuatorExplain>
<ActuatorProvider:ActuatorID rdf:datatype="&xsd;string">"SD01"</ActuatorProvider:ActuatorID>
<ActuatorProvider:ActuatorName rdf:datatype="&xsd;string">"Fan"</ActuatorProvider:ActuatorName>
<ActuatorProvider:ConnectsTo rdf:resource="&ActuatorProvider;ActuatorMiddleware1" />
<ActuatorProvider:PowerConsumption rdf:datatype="&xsd;integer">400</ActuatorProvider:PowerConsumption>
<ActuatorProvider:hasState rdf:resource="&ActuatorProvider;Offline" />
<rdf:type rdf:resource="&ActuatorProvider;Actuating_Device" /> </owl:NamedIndividual>
答案 0 :(得分:1)
您所显示的本体片段中没有ActuatorCode
属性,因此此查询无法删除任何内容。但是,您还没有展示完整的本体,因此我们无法判断这是否真的存在问题。请注意,DELETE WHERE
仅删除与其匹配的特定内容,因此除了声明ActuatorCode
属性的三元组外,它不会删除任何内容。
如果这确实存在,那么它已被删除,但听起来好像你想要删除与个人相关的所有内容,在这种情况下你想要一个更像下面的查询:
PREFIX AP0: <http://www.semanticweb.org/faiza/ontologies/2014/10/ActuatorProvider#>
DELETE
WHERE
{
?code AP0:ActuatorCode 1234 .
?code ?p ?o .
}
我注意到您的代码有一些其他奇怪之处,首先,对于大多数前缀,您的PREFIX
定义都是空的,这通常是一个不好的标志。如果您不需要这些前缀,请不要在查询中包含这些前缀。
其次,您通过简单的字符串连接在查询中附加一个常量,这是非常脆弱的。如果需要将值注入查询模板,最好使用文档中显示的SparqlParamterizedString
。您正在使用此课程,但没有充分利用此功能。
最后,您可以在C#中使用verbatim string literals,以便在您的代码中更轻松地编写和阅读查询,例如
public void deleteActuator(int actuatorCode)
{
TripleStore store = new TripleStore();
Graph mygraph = new Graph();
FileLoader.Load(mygraph, "D:/Masters Studies/Ontology/Providers/Actuator/ActuatorProvider.owl", new RdfXmlParser());
mygraph.BaseUri = null;
store.Add(my graph);
SparqlUpdateParser myparser = new SparqlUpdateParser();
SparqlParameterizedString querystring = new SparqlParameterizedString();
querystring.CommandText = @"PREFIX AP0: <http://www.semanticweb.org/faiza/ontologies/2014/10/ActuatorProvider#>
DELETE
WHERE { ?code AP0:ActuatorCode @ActuatorCode }";
// Inject parameter safely
querystring.SetLiteral("ActuatorCode", actuatorCode);
SparqlUpdateCommandSet cmds = myparser.ParseFromString(querystring);
LeviathanUpdateProcessor processor = new LeviathanUpdateProcessor(store);
processor.ProcessCommandSet(cmds);
mygraph.SaveToFile("D:/Masters
Studies/Ontology/Providers/Actuator/ActuatorProvider.owl");
}