在具有属性路径的查询中,“无法更改Set中变量的值”

时间:2014-01-15 03:36:16

标签: rdf sparql dotnetrdf

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

  

无法更改Set中变量的值

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

2 个答案:

答案 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

的tsame数据

所有查询都在这里。

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