Ich habe eine ziemlich komplizierte Sparql-Abfrage, die ich nicht schreiben kann. Hier ist ein vereinfachter Hintergrund der Ontologie:Wie schreibe ich eine Sparql-Abfrage für das Überprüfen von Duplikaten, ohne GROUP BY zu verwenden?
Eine Klasse "Fruit" hat Unterklassen "Apple" und "Mango". Eine andere Klasse "Ernährung" hat Unterklassen "Vitamin" und "Fiber". "fruit_has_nutrition" ist eine Eigenschaft, die Domain "Fruit" und Bereich "Nutrition" hat.
Dann habe ich die folgenden Instanzen:
Apple_1, Mango_1, Vitamin_1, Vitamin_2, Fiber_1 und Fiber_2, Fiber_3.
Hier finden Sie, was Apple_1 und Mango_1 wie folgt aussehen:
fruit:Apple_1
rdf:type fruit:Apple ;
fruit:fruit_has_nutrition fruit:Fiber_1 ;
fruit:fruit_has_nutrition fruit:Fiber_2 ;
fruit:fruit_has_nutrition fruit:Vitamin_1 ;
rdfs:label "Apple 1" ;.
fruit:Mango_1
rdf:type fruit:Mango ;
fruit:fruit_has_nutrition fruit:Fiber_3 ;
fruit:fruit_has_nutrition fruit:Vitamin_2 ;
rdfs:label "Mango 1" ;.
wird angenommen, dass eine Instanz von Obst wie viele Arten von Nahrung wie möglich enthalten kann, aber für jede Art, sollte es nur 1 Instanz, dass enthalten Ernährung. Wenn dies der Fall ist, verletzt Apple_1 die Annahme, da es zwei Instanzen von Fiber hat.
Daher die Abfrage, die ich schreiben möchte ist "gib mir alle Früchte, die mehrere Nährstoffe der gleichen Art haben, und geben Sie mir die Art dieser Nährstoffe". Mit den obigen Daten sollte es mir Apple_1 und Fiber zurückgeben.
Die Herausforderung Teil ist, dass ich nicht einfach GROUP BY rdf: Typ, weil es Unterschiede bei den Arten von Obst verliert. Ich versuchte MINUS (Alle Früchte - Früchte ohne Verletzung):
SELECT
WHERE {
?fruit fruit:fruit_has_nutrition ?nutrition .
?nutrition rdf:type ?type .
MINUS {SELECT DISTINCT ?fruit ?type
WHERE {
?fruit fruit:fruit_has_nutrition ?nutrition .
?nutrition rdf:type ?type .
}
}
}
Aber das endet, mir nichts zu geben.
Gibt es eine Möglichkeit, nach zwei Variablen zu gruppieren? Wie sonst kann ich diese Abfrage schreiben?
Vielen Dank !!
Mmmm; Sie benötigen einen aggregierten Wert von 2, aber da ich mit dieser Syntax nicht vertraut bin, kann ich nur einen SQL-Ansatz anbieten. Wenn es nicht sinnvoll ist, werde ich ihn als Antwort entfernen. –