gpt4 book ai didi

SPARQL 删除查询 dotNetRDF 不修改 RDF 文件

转载 作者:行者123 更新时间:2023-12-04 04:45:59 31 4
gpt4 key购买 nike

我喜欢使用 dotNetRDF 从 RDF 文件中删除 RDF 元组。这是我正在使用的代码

  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 文件应用任何更改。

最佳答案

问题是您的更新在默认图上运行,但您的数据集仅包含一个命名图。

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

请注意,我使用了 verbatim string literals为了可读性并通过 SetUri() 注入(inject)参数和 SetLiteral()而不是字符串连接。

关于SPARQL 删除查询 dotNetRDF 不修改 RDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173387/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com