9

私は SPARQL を使用していますが、sparql を in 節に入れることはできますか? より具体的には、この sparql クエリの特定の条件を持つエンティティ (s1、s2) を取得する必要があります [フィールドに対する s1 の集計値は 5 よりも大きい]

select 
?s1 ?x ?s2.
WHERE {
         {?s1 rdf:type dbpedia-owl:Scientist.}
         {?s2 rdf:type dbpedia-owl:Scientist.}
         {?s2 dbpedia-owl:field ?x.}
         {?s1 dbpedia-owl:field ?x.}
}

したがって、このような IN 句を追加する必要があります

SELECT
?s1 ?x ?s2.
WHERE {
      {?s1 rdf:type dbpedia-owl:Scientist.}
      {?s2 rdf:type dbpedia-owl:Scientist.}
      {?s2 dbpedia-owl:field ?x.}
      {?s1 dbpedia-owl:field ?x.}
      {?s1 IN 
            {
             SELECT  ?s1  WHERE {
                                    SELECT ?s1 (COUNT(?p) AS ?prizes) {
                                    ?s1 dbpprop:prizes ?p.
                                    } group by (?s1) 
                                 }FILTER (?prizes > 2) 
             }
       }
 }

しかし、sparql クエリ パーサーでエラーが発生しました。修正方法を知っている人はいますか?

4

3 に答える 3

7

INSPARQL では SQL とは多少異なる使用法があり、次のFILTERような範囲内でのみ使用できます。

FILTER(?s IN (<this>, <that>, <another>))

ただし、サブクエリを単独で使用するだけで、SPARQL 評価のボトムアップ結合セマンティクスにより、望ましい結果が得られるはずです。

SELECT ?s1 ?x ?s2
WHERE 
{
  ?s1 rdf:type dbpedia-owl:Scientist.
  ?s2 rdf:type dbpedia-owl:Scientist.
  ?s2 dbpedia-owl:field ?x.
  ?s1 dbpedia-owl:field ?x.
  {
    SELECT ?s1 WHERE 
    {      
      ?s1 dbpprop:prizes ?p.
    }
    GROUP BY ?s1 
    HAVING (COUNT(?p) > 2) 
  }
}

クエリの他の部分も簡略化したことに気付くかもしれません。HAVING句を使用して集計条件を指定できるため、ネストされた 2 つのサブクエリを使用する必要はありません。

{ }また、個々のトリプル パターンを配置する必要はありません。実際、これを行うと、パフォーマンスが大幅に低下する可能性があります。

于 2012-11-30T18:34:09.227 に答える