========================= AUFGABE 1 ================================= @prefix ex: . @prefix xsd: . ex:Sonne ex:radius "1.392e6"^^xsd:double ; ex:satellit ex:Merkur, ex:Venus, ex:Erde, ex:Mars . ex:Merkur ex:radius "2439.7"^^xsd:double . ex:Venus ex:radius "6051.9"^^xsd:double . ex:Erde ex:radius "6372.8"^^xsd:double ; ex:satellit ex:Mond . ex:Mars ex:radius "3402.5"^^xsd:double ; ex:satellit ex:Phobos, ex:Deimos . ex:Mond ex:name "Mond"@de, "Moon"@en ; ex:radius "1737.1"^^xsd:double . ex:Phobos ex:name "Phobos" . ex:Deimos ex:name "Deimos" . --------------------------------------------------------------------- Objekte, die um die Sonne oder um einen Satelliten der Sonne kreisen SELECT ?x WHERE { { ex:Sonne ex:satellit ?x } UNION { ex:Sonne ex:satellit ?y. ?y ex:satellit ?x } } --------------------------------------------------------------------- Objekte mit einem Volumen von über 2*1010 (km3) (Objekte mit Radius können mit der Formel V = 4/3r3 berechnet werden) und falls vorhanden, mit dem Objekt dessen Satellit sie sind. SELECT ?x ?y WHERE{ ?x ex:radius ?rad . FILTER( 4*3.14*?rad*?rad*?rad/3 > 20000000000 ). OPTIONAL { ?y ex:satellit ?x . } } --------------------------------------------------------------------- Objekte mit einem Satelliten, für den ein Name in englischer Sprache angegeben worden ist, die außerdem Satellit eines Objekts von über 3000 (km) Durchmesser sind SELECT ?Objekt { ?Objekt ex:satellit ?Satellit . ?Satellit ex:name ?SatName . FILTER( LANG(?SatName) = "en" ). ?GrossObjekt ex:satellit ?Objekt . ?GrossObjekt ex:radius ?Radius . FILTER( 2*?Radius > 3000 ) } --------------------------------------------------------------------- Objekte mit zwei oder mehr Satelliten (nehmen Sie an, dass unterschiedliche URIs hier unterschiedliche Objekte bezeichnen) SELECT DISTINCT ?x { ?x ex:satellit ?a . ?x ex:satellit ?b . FILTER( ! sameTERM( ?a, ?b ) ) . } =============== AUFGABE 2 ================================ @prefix ex: . @prefix xsd: . @prefix rdf: . ex:Sonne rdf:type ex:Himmelskörper ; ex:radius "1.392e6"^^xsd:double ; ex:satellit ex:Merkur, ex:Venus, ex:Erde, ex:Mars . ex:Merkur rdf:type ex:Himmelskörper ; ex:radius "2439.7"^^xsd:double . ex:Venus rdf:type ex:Himmelskörper ; ex:radius "6051.9"^^xsd:double . ex:Erde rdf:type ex:Himmelskörper ; ex:radius "6372.8"^^xsd:double ; ex:satellit ex:Mond . ex:Mars rdf:type ex:Himmelskörper ; ex:radius "3402.5"^^xsd:double ; ex:satellit ex:Phobos, ex:Deimos . ex:Mond rdf:type ex:Himmelskörper ; ex:name "Mond"@de, "Moon"@en ; ex:radius "1737.1"^^xsd:double . ex:Phobos rdf:type ex:Himmelskörper ; ex:name "Phobos" . ex:Deimos rdf:type ex:Himmelskörper ; ex:name "Deimos" . --------------------------------------------------------------------- SELECT ?x { ?x rdf:type ex:Himmelskörper. OPTIONAL { ?x ex:satellit ?satellit }. FILTER( !BOUND( ?satellit ) ) } ============================== AUFGABE 3 ============================= @prefix ex: . @prefix xsd: . ex:a ex:value "1"^^xsd:integer ; ex:value "3"^^xsd:integer . ex:b ex:value "2"^^xsd:integer . --------------------------------------------------------------------- 1. SELECT ?s ?v WHERE{ ?s ex:value ?v } ORDER BY ?v ?s ?v a 1 b 2 a 3 Wie erwartet werden die Ergebnisse nach v sortiert --------------------------------------------------------------------- 2. SELECT ?s WHERE{ ?s ex:value ?v } ORDER BY ?v ?s a b a Auch hier werden die Ergebnisse wieder nach v sortiert. v wird nur nicht angezeigt --------------------------------------------------------------------- 3. SELECT ?s WHERE{ ?s ex:value ?v } ORDER BY DESC(?v) LIMIT 2 ?s a b Diesmal wird genau umgekehrt sortiert. Anschließend werden aber nur noch zwei Ergebnisse angezeigt --------------------------------------------------------------------- 4. SELECT DISTINCT ?s WHERE{ ?s ex:value ?v } ORDER BY ?v ?s a b Ansich die selbe Anfrage wie (2) nur das wir nun mit DISTINCT zusätzlich doppelte Werte aussortieren. --------------------------------------------------------------------- 4a. SELECT DISTINCT ?s WHERE{ ?s ex:value ?v } ORDER BY ?v LIMIT 1 ?s a Auch hier gibt es keine Überraschungen, das liegt an der festgelegten Reihenfolge der Modifikatoren bei SPARQL: 1. Sortierung anhand von ORDER BY 2. Entfernung nicht ausgewählter Variablen 3. Entfernung doppelter Ergebnisse (DISTINCT) 4. Entfernung der Ergebniszeilen vor dem OFFSET 5. Entfernung der überschüssigen Zeilen nach LIMIT Siehe hierzu auch im Skript zu SPARQL auf Seite 25