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

私はこの問題を解決するために何かを見つけようとしました。このエラーは、このように複雑な記号 (ex. use | / *) を使用すると発生します。

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

このようにクエリを分離した後

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

このクエリはすべてサブクラスです。そして2番目

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

それは同じデータを持っています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 に答える