繁体   English   中英

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

[英]Sparql Delete query does not give results using 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>

所显示的本体片段中没有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中所示的SparqlParamterizedString 您正在使用此类,但不要利用此功能。

最后,您可以在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");

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM