0

我正在使用 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>
4

1 回答 1

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如果您需要将值注入查询模板,最好使用文档中所示的 a。您正在使用此类,但没有利用此功能。

最后,您可以在 C# 中使用逐字字符串文字来使您的查询更易于在代码中编写和阅读,例如

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");

}
于 2014-12-18T09:46:13.320 回答