2

我正在使用 DotNetRDF(从 BitBucket 下载)执行 SPARQL 查询,但是在使用带有属性路径的查询时出现异常:

Set 中变量的值不能改变

这是 RDF、SPARQL 查询和执行查询的 C# 代码的一部分。我希望查询返回id/002and 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;
    }
4

2 回答 2

2

因此,正如评论中所指出的,这确实是属性路径引擎中的一个错误 - 请参阅CORE-395

本质上,问题是当 dotNetRDF 转换路径以进行评估时,它没有正确分配临时变量。这意味着指定的路径实际上没有被正确评估,这要么导致您看到的错误,要么默默地返回部分/不正确的结果。

现在已修复此问题,并将包含在即将发布的 1.0.3 版本中,该版本将于本周末发布。

编辑

带有修复程序的 1.0.3 版本于 2014 年 1 月 17 日发布,现在可用

于 2014-01-16T09:18:03.623 回答
0

我尝试并找到了解决此问题的方法。这样使用复杂符号(例如使用| / *)时会发生此错误

(rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))*

在我这样分开我的查询之后

1. <http://ex.info/id/001> rdfs:subClassOf* ?superclass . 

此查询所有子类。第二个

2. <http://ex.info/id/001> (rdfs:subClassOf/owl:intersectionOf/rdf:rest*/rdf:first)* ?superclass .

这个查询所有rdfs:subClassOf的owl:intersectionOf下的rdf:Description。

并使用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

它有 tsame 数据删除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))
}
于 2014-01-15T13:51:14.297 回答