2016-06-29 1 views
0

Je souhaite effectuer une suppression qui supprime tous les triplets où il y a moins de x objets distincts par sujet.Est-il possible de faire un SPARQL DELETE {} WHERE {} avec un filtre (COUNT (DISTINCT? Obj)> x) dans la clause WHERE?

La requête devrait ressembler à l'intention quelque chose comme ça après mon sentiment:

DELETE { ?sub ?pred ?obj . } 
WHERE { 
    {SELECT ?sub ?pred ?obj (count(?obj) as ?count) 
    WHERE { ?sub ?pred ?obj . 
     } GROUP BY ?sub 
    } FILTER(?count < 14) 
} 

La précède ne fonctionne pas.

Un GROUP BY est également nécessaire pour atteindre la partie ?obj par ?sub, mais je n'arrive pas à comprendre comment procéder.

Quelqu'un peut-il me pousser dans la bonne direction pour résoudre cette tâche?

+1

Qu'entendez-vous par «ne fonctionne pas»? S'il y a un message d'erreur, veuillez l'inclure dans la question. – chrisis

+1

Tout d'abord, je pense que vous devez avoir votre 'SELECT' droit, ce qui ne semble pas être le cas. Si vous pensez que votre défi peut être spécifique à Virtuoso, veuillez ajouter des informations sur la version, et aussi poser votre question à la liste de diffusion [Liste de diffusion Virtuoso Users] (https://lists.sourceforge.net/lists/listinfo/virtuoso-users/), les [Forums de support OpenLink] (http://boards.openlinksw.com/support/index.php) ou un [dossier de prise en charge OpenLink] (http://support.openlinksw.com/support/online-support.vsp) . (ObDisclaimer: Je travaille pour [OpenLink Software] (http://www.openlinksw.com/), fabricant de [Virtuoso] (http://virtuoso.openlinksw.com/).) – TallTed

+1

Voulez-vous juste supprimer le '{? sub? pred? obj. } 'triple ou voulez-vous supprimer'? sub'? Si vous voulez ce dernier, vous voudrez supprimer les références à '? Sub'. – scotthenninger

Répondre

3

Notez que votre sous-requête n'est pas réellement une requête légale. Si vous essayez de valider que la sous-requête sur sparql.org's query validator, vous obtenez cette sortie:

Syntax error:

Non-group key variable in SELECT: ?pred

Étrangement, cependant, toute requête -t validate avec le update validator. Il ne sait pas exactement de votre requête essayé exactement ce que vous essayez de supprimer, et la déclaration:

I want to achieve a delete which deletes all triples where there are less than x distinct objects per subject.

ne fait pas parfaitement clair non plus. Si vous essayez de supprimer triplets avec un sujet qui est lié à moins de 10 objets distincts sur tous les prédicats utilisés avec ce sujet, vous souhaitez les trouver comme ceci:

select ?s ?p ?o { 
    ?s ?p ?o 
    { select ?s { ?s ?pp ?oo } 
    group by ?s 
    having (count(distinct ?oo) < 10) } 
} 

Ensuite, étendre cela pour faire une suppression est facile:

delete { ?s ?p ?o } 
where { 
    ?s ?p ?o 
    { select ?s { ?s ?pp ?oo } 
    group by ?s 
    having (count(distinct ?oo) < 10) } 
} 
+0

Vous devriez signaler cela comme un bug aux développeurs d'Iéna. – AKSW

+0

C'est exactement ce que je voulais réaliser, désolé pour mon explication de salaire. (Ma confusion avec ma requête n'a pas aidé à éclaircir cela je suppose) J'ai effectivement rencontré cela. J'ai essayé le validateur et j'étais content quand il ne s'est pas plaint alors je n'ai pas pu voir ce qui s'est réellement passé! Je vous remercie! – oole

+0

@AKSW Rapporté comme https://issues.apache.org/jira/browse/JENA-1203 –