我正在使用DotNetRDF(downloaded from BitBucket)执行SPARQL查询,但在使用带有属性路径的查询时出现异常:
无法更改Set中变量的值
以下是RDF,SPARQL查询和执行查询的C#代码的一部分。我希望查询返回id/002
和id/003
。
<owl:Class rdf:about="http://ex.info/id/001">
<rdfs:label xml:lang="en">example data</rdfs:label>
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<rdf:Description rdf:about="http://ex.info/id/002"/>
<rdf:Description rdf:about="http://ex.info/id/003"/>
<owl:Restriction>
<owl:onProperty rdf:resource="http://ex.info/id/004"/>
<owl:someValuesFrom rdf:resource="http://ex.info/id/005"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?superclass where {
<http://ex.info/id/001> (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
filter(!isBlank(?superclass))
}
public List<string> queryData2(string query)
{
IGraph g = new Graph();
FileLoader.Load(g, filePath);
SparqlResultSet results = (SparqlResultSet)g.ExecuteQuery(query);
List<string> output = new List<string>();
foreach (SparqlResult result in results)
{
output.Add(result.ToString());
}
return output;
}
答案 0 :(得分:2)
正如评论中所述,这确实是属性路径引擎中的一个错误 - 请参阅CORE-395
基本上问题是当dotNetRDF翻译了评估路径时,它没有正确分配临时变量。这意味着指定的路径实际上没有被正确评估,导致您看到的错误或者静默返回部分/不正确的结果。
现在已经修复,将包含在即将发布的1.0.3版本中,该版本将在本周末发布。
该修补程序的1.0.3版本于2014年1月17日发布,现已推出
答案 1 :(得分:0)
我尝试找到解决这个问题的方法。这样 使用复杂符号(例如使用| / *)时会发生此错误
(rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))*
我将此查询分开后
1. <http://ex.info/id/001> rdfs:subClassOf* ?superclass .
此查询所有子类。和secound
2. <http://ex.info/id/001> (rdfs:subClassOf/owl:intersectionOf/rdf:rest*/rdf:first)* ?superclass .
此查询所有rdf:owl下的描述:rdfs:subClassOf的intersectionOf。
并使用UNION
像这样一起加入
select ?superclass where {
{
<http://ex.info/id/001> rdfs:subClassOf* ?superclass .
}
UNION
{
<http://ex.info/id/001> (rdfs:subClassOf/owl:intersectionOf/rdf:rest*/rdf:first)* ? superclass .
}
filter(!isBlank(?superclass))
}
输出
?superclass = http://ex.info/id/001,
?superclass = http://ex.info/id/001,
?superclass = http://ex.info/id/002,
?superclass = http://ex.info/id/003
它删除了DISTINCT
所有查询都在这里。
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select DISTINCT ?superclass where {
{
<http://ex.info/id/001> rdfs:subClassOf* ?superclass .
}
UNION
{
<http://ex.info/id/001> (rdfs:subClassOf/owl:intersectionOf/rdf:rest*/rdf:first)* ?superclass .
}
filter(!isBlank(?superclass))
}