Sparql Delete查询不使用dotnetrdf给出结果

时间:2014-12-18 06:20:30

标签: rdf sparql ontology dotnetrdf

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

1 个答案:

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

}