2017-04-25 2 views
1

Je suis en train d'obtenir la liste de tous les auteurs qui ont eu 3 ou plus morceau de travail (en DBpedia).J'essaie d'obtenir la liste de tous les auteurs qui ont eu plus de 3 pièce de travail - DBpedia SPARQL

mon exemple peut être exécuté sur: http://dbpedia.org/sparql

code de base

select (count(?work) as ?totalWork), ?author 
Where 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 

Je reçois chaque auteurs montant total de pièce de travail. Mais quand j'essaye de filtrer pour montrer seulement la liste d'auteur qui a plus de 3 morceau de travail. Je reçois l'erreur:

j'ai essayé PRESENTANT mot-clé ou par mot-clé FILTRE.

Utiliser le filtre

select (count(?work) as ?tw), ?author 
Where 
{ 
    ?work dbo:author ?author. 
    FILTER (?work > 3). 
} 
GROUP BY ?author 

error: Virtuoso 22023 Error VECDT: SR066: Unsupported case in CONVERT (INTEGER -> IRI_ID) 

utilisant le mot clé AYANT

select (count(?work) as ?tw), ?author 
Where 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 
HAVING (?tw > 3) 

Virtuoso 37000 Error SP031: SPARQL compiler: Variable ?tw is used in the result set outside aggregate and not mentioned in GROUP BY clause 

Répondre

3

L'utilisation HAVING est correct, mais il y a un limitation in SPARQL with indirectly referring to aggregates.

Celui-ci fonctionne:

SELECT (count(?work) as ?tw) ?author 
WHERE 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 
HAVING (count(?work) > 3) 
+0

@TallTed Merci de la référence, je ne savais pas. Malheureusement, cela ne génère pas d'erreur sur http://sparql.org/query-validator.html. Je vais parler aux mainteneurs là-bas. – AKSW

1

utilisant AYANT

En plus de la réponse de AKSW - https://github.com/openlink/virtuoso-opensource/issues/254.

l'aide du filtre

Vous devriez écrire quelque chose comme ça:

SELECT * 
WHERE 
{ 
    { 
    SELECT ?author (COUNT(?work) AS ?tw) 
    WHERE 
    { 
    ?work dbo:author ?author. 
    } GROUP BY ?author 
    } FILTER (?tw > 3) 
} 
1

HAVING (?tw > 3) est SPARQL correcte. HAVING filtres après affectations en raison de SELECT, de sorte que ?tw est visible, et avant projection.

(prefix ((dbo: <http://purl.org/dc/elements/1.1/>)) 
    (project (?tw ?author) 
     (filter (> ?tw 3) 
     (extend ((?tw ?.0)) 
      (group (?author) ((?.0 (count ?work))) 
      (bgp (triple ?work dbo:author ?author))))))) 

?.0 est l'attribution de count.

+0

J'ai essayé de lancer ceci mais ça donne une erreur, j'aimerais voir le résultat et comprendre le code. Quelqu'un peut-il résoudre ce problème: Virtuose 37000 Erreur SP030: compilateur SPARQL, ligne 0: seulement « (» et DISTINCT sont autorisés après mot-clé COUNT dans l'expression SPARQL à –

+0

Ce que vous dites ici semble être en contraction directe à la spécification - '? ["Notez qu'en raison de la position logique dans laquelle la clause HAVING est évaluée, les expressions projetées par la clause SELECT ne sont pas visibles à la clause HAVING."] (Https://www.w3.org/TR/sparql11-query/# sparqlHavingClause) – TallTed

+0

@MurlidharFichadia, c'est l'algèbre SPARQL, pas SPARQL. –