Sparql Keys vs verschiedene Werte

7

Ich habe eine Sparql-Abfrage, die Duplikate zurückgibt, und ich möchte, dass sie auf einem der Werte (subjectID) bereinigt wird. Im Gegensatz zu DISTINCT scheint ein eindeutiger Wert für die Kombination der ausgewählten Werte gefunden zu werden und nicht nur für einen der Parameter. Ich habe gesehen, dass hier jemand eine Gruppe vorschlägt, aber das scheint nur dann zu gelten, wenn ich alle Parameter nach der Gruppe aufliste (mein SPARQL-Endpunkt beklagt sich, z. B. Nichtgruppen-Schlüsselvariable in SELECT:? Beruf). Ich habe versucht, eine interne Auswahl auszuführen, aber es scheint nicht für diese spezifische Abfrage zu funktionieren. Könnte also ein Problem mit der Abfrage selbst sein (die Werte von "lavedIn" scheinen das Duplikat zu verursachen)?

Obwohl wir mit relationalen DBs bereits früh genug in der Lernkurve mit SPARQL zufrieden sind, können Sie das Offensichtliche für die Uneingeweihten erklären! :)

%Vor%     
Nava 10.07.2012, 18:42
quelle

2 Antworten

12

Zur Fehlermeldung:

  

Nicht-Gruppenschlüsselvariable in SELECT:? Besetzung

Sie können dies vermeiden, indem Sie das SAMPLE() Aggregat verwenden - dies erlaubt Ihnen, nur auf ?subjectID zu gruppieren, aber trotzdem Werte für den Rest der Variablen auszuwählen, vorausgesetzt, Sie interessieren sich nur für einen Wert für diese anderen Variablen / p>

Hier ist ein einfaches Beispiel dafür:

%Vor%     
RobV 10.07.2012 18:58
quelle
9

Als erstes ist zu beachten, dass es in RDF / SPARQL eigentlich keinen Schlüssel gibt. Sie fragen ein Diagramm ab, und ?subjectID kann einfach mehrere mögliche Kombinationen von Werten für die anderen Variablen haben, die Sie auswählen. Dies wird durch die Form der Grafik verursacht, die Sie abfragen: Vielleicht hat Ihre Person mehr als einen englischen Namen oder umgekehrt: Derselbe englische Name kann von mehr als einer Person geteilt werden.

Eine SPARQL SELECT-Abfrage ist ein seltsames Biest: Sie fragt eine Graphenstruktur ab, präsentiert aber das Ergebnis als eine flache Tabelle (technisch gesehen ist es eine Sequenz von Mengen variabler Bindungen, aber es ist dasselbe). Duplikate treten auf, weil verschiedene Kombinationen von Werten für Ihre Variablen gefunden werden können, indem Sie grundsätzlich verschiedenen Pfaden im Diagramm folgen.

Die Tatsache, dass Sie doppelte Werte für ?subjectID in Ihrem Ergebnis erhalten, ist daher unvermeidbar, einfach deshalb, weil dies aus der Sicht des RDF-Graphen einzigartige Lösungen für Ihre Anfrage sind. Sie können Ergebnisse nicht herausfiltern, ohne tatsächlich Informationen zu verlieren. Daher ist es im Allgemeinen schwierig, Ihnen eine Lösung zu geben, ohne genau zu wissen, welche 'Duplikate' Sie verwerfen möchten: Möchten Sie nur einen möglichen englischen Namen? für jedes Thema oder ein mögliches Geburtsdatum (auch wenn es mehr als eins in Ihren Daten gibt)?

Hier finden Sie jedoch einige Tipps zur leichteren Handhabung / Verarbeitung solcher Ergebnisse:

Als Erstes könnten Sie eine ORDER BY -Klausel für Ihre ?subjectID -Variable verwenden. Dadurch erhalten Sie immer noch mehrere Zeilen mit dem gleichen Wert für ?subjectID , aber sie sind alle in der richtigen Reihenfolge, sodass Sie Ihr Ergebnis effizienter verarbeiten können.

Eine andere Lösung besteht darin, Ihre Abfrage in zwei Teile aufzuteilen: machen Sie eine erste Abfrage, dass nur alle eindeutigen Subjekte (und möglicherweise alle anderen Werte, für die Sie im Voraus wissen, dass sie eindeutig sind) auswählt das Thema), dann iterieren Sie über das Ergebnis und führen Sie eine separate Abfrage durch, um die anderen Werte zu erhalten, die Sie interessieren, für jeden einzelnen subjectID-Wert . Diese Lösung mag wie Häresie klingen (vor allem, wenn Sie aus einem SQL-Hintergrund stammen), aber es könnte tatsächlich schneller und einfacher als der Versuch, alles in einer großen Abfrage zu tun.

Eine weitere Lösung ist die von RobV vorgeschlagene Lösung: Verwenden Sie ein SAMPLE Aggregat für eine bestimmte Variable, um nur einen (zufälligen) eindeutigen Wert auszuwählen. Eine Variante dazu ist die Verwendung des Aggregats GROUP_CONCAT , das durch Verketten aller möglichen Werte in einer einzigen Zeichenfolge einen einzelnen Wert erzeugt.

    
Jeen Broekstra 11.07.2012 21:21
quelle

Tags und Links