2017-11-09 4 views
0

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 !!

+0

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. –

Antwort

2

Vielleicht machen Sie das Problem, das ich nicht verstehen, anzusprechen, aber warum kann auch nicht Sie Gruppe von fuit geben?

Wie üblich, keine minimalen Probendaten, die für den Test verwendet werden können, damit eine nicht getestete Abfrage, die falsch sein könnte:

select ?fruit ?fruit_type { 
    ?fruit fruit:fruit_has_nutrition ?nutrition . 
    ?nutrition rdf:type ?fruit_type . 
} 
group by ?fruit ?fruit_type 
having (count(?nutrition) > 1) 
+0

Vielen Dank !! Es klappt! Geschätzt! Ich glaube, ich habe vorher ein Klammerproblem bekommen! Entschuldige vielmals! – vw511

+0

Kein Problem. Vergessen Sie nicht, diese Antwort zu akzeptieren, wenn sie die richtige Lösung bietet. – AKSW

+0

Ist Ihre Frage jetzt gelöst? Hast du noch Fragen zu dieser Antwort? Um eine Antwort zu akzeptieren "[** Klicken Sie auf das Häkchen **] (https://ibb.co/ikqyO6)" Weitere Informationen finden Sie unter [help/accepting] (https://stackoverflow.com/help/someone-answers) –

0

Ohne die gewünschte Syntax versucht, dies ist eine Möglichkeit, es in SQL

select * 
from fruits f 
inner join (
     select fruit,nutrition 
     from fruits 
     group by fruit,nutrition 
     having count(*) > 1 
    ) dups on f.fruit = dups.friuits and f.nutrition = dups.nutrition 
+0

Danke! Es gibt mir gute Einsichten, obwohl es nicht Shacl ist. – vw511