2016-06-29 25 views
0

Ich möchte eine Löschung erreichen, die alle Tripel löscht, wenn weniger als x verschiedene Objekte pro Subjekt vorhanden sind.Ist es möglich, eine SPARQL DELETE {} WHERE {} mit einem FILTER (COUNT (DISTINCT? Obj)> x) in der WHERE-Klausel zu machen?

Die beabsichtigte Abfrage sollte so etwas wie dies nach meinem Gefühl aussehen:

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

Die oben funktioniert nicht.

Auch eine GROUP BY ist notwendig, um die ?obj pro ?sub Teil zu erreichen, aber ich kann mir nicht vorstellen, wie dies zu tun ist.

Kann mich jemand in die richtige Richtung drängen, um diese Aufgabe zu lösen?

+1

Was meinst du mit "funktioniert nicht"? Wenn eine Fehlermeldung angezeigt wird, fügen Sie sie bitte in die Frage ein. – chrisis

+1

Zuerst denke ich, Sie müssen Ihr 'SELECT' richtig machen, was es nicht zu sein scheint. Wenn Sie der Meinung sind, dass Ihre Herausforderung Virtuoso-spezifisch sein könnte, fügen Sie bitte Versionsinformationen hinzu und richten Sie Ihre Frage auch an die [Virtuoso Users Mailingliste] (https://lists.sourceforge.net/lists/listinfo/virtuoso-users/), das [OpenLink Support Forum] (http://boards.openlinksw.com/support/index.php) oder einen [OpenLink Support Case] ​​(http://support.openlinksw.com/support/online-support.vsp) . (ObDisclaimer: Ich arbeite für [OpenLink Software] (http://www.openlinkssw.com/), Hersteller von [Virtuoso] (http://virtuoso.openlinkssw.com/).) – TallTed

+1

Möchten Sie nur die löschen '{? sub? pred? obj. } 'verdreifacht oder willst du'? sub' löschen? Wenn Sie das letztere wollen, werden Sie Referenzen auf "sub" entfernen wollen. – scotthenninger

Antwort

3

Beachten Sie, dass Ihre Unterabfrage keine gültige Abfrage ist. Wenn Sie versuchen, nur die Unterabfrage auf sparql.org's query validator zu überprüfen, erhalten Sie diese Ausgabe:

Syntax error:

Non-group key variable in SELECT: ?pred

Merkwürdigerweise, obwohl die ganze Abfrage tut Validieren mit dem update validator. Es ist nicht ganz klar von Ihrer versuchten Abfrage, was genau Sie versuchen zu löschen, und die Aussage:

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

macht es auch nicht vollkommen klar. Wenn Sie versuchen, Tripel mit einem Thema zu löschen, die weniger als 10 verschiedene Objekte über alle die Prädikate mit diesem Thema verwendet verwandt ist, würden Sie sie wie diese finden:

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

Dann zu erweitern, um ein Löschen zu tun ist einfach:

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

Das sollten Sie den Jena-Entwicklern als Bug melden. – AKSW

+0

Genau das wollte ich erreichen, Entschuldigung für meine Lohn-Erklärung. (Meine Verwirrung mit meiner Frage hat nicht geholfen, das zu klären, denke ich) Ich bin tatsächlich in das hineingeraten. Ich habe den Validator ausprobiert und war glücklich, wenn es sich nicht beschwerte, also konnte ich nicht sehen, was wirklich passiert ist! Vielen Dank! – oole

+0

@AKSW Berichtet als https://issues.apache.org/jira/browse/JENA-1203 –