sparql — συγκεντρωτικός οδηγός — DedSec Project
sparql — συγκεντρωτικός οδηγός SPARQL Η RDF αποθηκεύει τριάδες υποκείμενο–κατηγόρημα–αντικείμενο. Η SPARQL αναζητά μοτίβα γράφου· η απουσία μιας τριάδας δεν αποδεικνύει ότι η σχέση είναι…
SPARQL
Η RDF αποθηκεύει τριάδες υποκείμενο–κατηγόρημα–αντικείμενο. Η SPARQL αναζητά μοτίβα γράφου· η απουσία μιας τριάδας δεν αποδεικνύει ότι η σχέση είναι ψευδής. Χρησιμοποίησε τοπικό εργαλείο SPARQL 1.1 και προσωρινό dataset.
Αναπαραγώγιμο παράδειγμα δύο αρχείων
Αποθήκευσε και εισήγαγε το friends.ttl:
@prefix ex: <https://example.org/> .
ex:ada ex:knows ex:grace, ex:lin .
ex:grace ex:knows ex:lin .
ex:lin ex:knows ex:ada .
Εκτέλεσε το friends.rq στο ίδιο dataset:
PREFIX ex: <https://example.org/>
SELECT ?person (COUNT(?friend) AS ?connections)
WHERE {
?person ex:knows ?friend .
FILTER(?person != ?friend)
}
GROUP BY ?person
ORDER BY DESC(?connections) ?person
Αναμένουμε Ada=2, Grace=1 και Lin=1. Το GROUP BY καθορίζει τις ομάδες και το δεύτερο κριτήριο ORDER BY δίνει σταθερή σειρά σε ισοβαθμίες.
Έλεγχοι ορίων
Πρόσθεσε δεύτερη φορά την τριάδα Ada→Lin: ο γράφος RDF είναι σύνολο και το πλήθος παραμένει 2. Πρόσθεσε Lin→Lin: το FILTER αποκλείει την αυτοσύνδεση. Αφαίρεσε το GROUP BY κρατώντας το ?person στην προβολή και παρατήρησε το σφάλμα.
Άσκηση: πρόσθεσε HAVING (COUNT(?friend) >= 2) και στη συνέχεια OPTIONAL για ετικέτες. Εξήγησε πότε μια μεταβλητή μένει χωρίς τιμή.
Διάγνωση: για μηδενικά αποτελέσματα δοκίμασε πρώτα SELECT * WHERE { ?s ?p ?o } LIMIT 5. Έλεγξε γράφο και prefix IRIs πριν αλλάξεις τη λογική. Μην ενημερώνεις δημόσιο endpoint χωρίς άδεια.
Προδιαγραφή: https://www.w3.org/TR/sparql11-query/
Εργαστήριο εξάσκησης: SPARQL
Όρισε πλήρως τα δεδομένα
Το αρχικό ερώτημα επιστρέφει έως πέντε υποκείμενα από οποιαδήποτε τριάδα· χωρίς δεδομένα μπορεί να επιστρέψει μηδέν γραμμές. Για αναπαραγώγιμη άσκηση δημιούργησε τοπικό people.ttl:
@prefix ex: <https://example.org/people/> .
ex:ada ex:age 21 .
ex:ben ex:age 17 .
ex:cy ex:age 21 .
Φόρτωσέ το ως προεπιλεγμένο γράφο σε τοπική μηχανή SPARQL 1.1 και εκτέλεσε:
PREFIX ex: <https://example.org/people/>
SELECT ?person WHERE {
?person ex:age ?age .
FILTER (?age >= 18)
}
ORDER BY ?person
Προβλέπονται οι τιμές ex:ada και ex:cy, με αυτή τη σειρά. Ορισμένα εργαλεία εμφανίζουν πλήρεις διευθύνσεις IRI αντί συντομεύσεων. Πρόκειται για αναμενόμενο αποτέλεσμα, όχι επιβεβαιωμένη εκτέλεση.
Εξήγησε τι αντιστοιχίζεται
Η τριάδα δεσμεύει ?person και ?age. Το FILTER κρατά μόνο ηλικίες τουλάχιστον 18. Πρόσθεσε ex:dan ex:label "Dan". χωρίς ex:age. Δεν πρέπει να εμφανιστεί, επειδή το υποχρεωτικό μοτίβο δεν ταιριάζει· δεν σημαίνει ότι η ηλικία είναι μηδέν. Με OPTIONAL θα μπορούσες να κρατήσεις τη γραμμή χωρίς τη δεσμευμένη ηλικία, αρκεί να ορίσεις πώς χειρίζεσαι τη μεταβλητή που λείπει.
Ξεχώρισε δύο ειδών αποτυχίες
Αφαίρεσε τη δήλωση PREFIX ex: και αποθήκευσε το πραγματικό συντακτικό σφάλμα για άγνωστο πρόθεμα. Στη συνέχεια επανάφερε το πρόθεμα και άλλαξε το φίλτρο σε ?age >= 30: τώρα το έγκυρο ερώτημα απλώς επιστρέφει κενό αποτέλεσμα. Αυτές οι δύο περιπτώσεις δεν είναι το ίδιο τεχνικό πρόβλημα.
Δεύτερη άσκηση και αποδείξεις
Πρόσθεσε δεύτερη τριάδα ex:age για το ίδιο άτομο. Σύγκρινε τα αποτελέσματα με και χωρίς SELECT DISTINCT. Εξήγησε γιατί πολλές τριάδες μπορούν να δώσουν επαναλαμβανόμενο υποκείμενο, και μέτρησε τις γραμμές. Χρησιμοποίησε μόνο τεχνητά δεδομένα σε τοπικό γράφο. Κατάγραψε τρόπο φόρτωσης, έκδοση μηχανής και πραγματική έξοδο. Πρότυπο: https://www.w3.org/TR/sparql11-query/
SPARQL — Διαδρομή ουσιαστικής εξάσκησης
Μοντέλο δεδομένων ως γράφημα
Η SPARQL ερωτά RDF triples: υποκείμενο, κατηγόρημα και αντικείμενο. Το prefix συντομεύει IRI και δεν μετατρέπει τη σχέση σε SQL table. Το ακόλουθο dataset μπορεί να φορτωθεί ως Turtle σε δοκιμαστικό RDF store.
@prefix ex: <https://example.org/> .
ex:alice ex:knows ex:bob .
ex:bob ex:age 25 .
ex:carol ex:knows ex:alice .
Ερώτημα για σχέσεις γνωριμίας και προαιρετική ηλικία:
PREFIX ex: <https://example.org/>
SELECT ?person ?friend ?age
WHERE {
?person ex:knows ?friend .
OPTIONAL { ?friend ex:age ?age }
}
ORDER BY ?person ?friend
Η πρώτη σχέση επιστρέφει age=25 για τον bob, ενώ στη δεύτερη σχέση η ηλικία του alice είναι unbound. Μην θεωρείς ότι μία unbound variable αντιστοιχεί ακριβώς σε SQL NULL: το μοντέλο bindings και expressions έχει δικούς του κανόνες.
OPTIONAL έναντι υποχρεωτικού pattern
Αν αφαιρέσεις το OPTIONAL και απαιτήσεις το age pattern, η σχέση carol→alice δεν θα έχει complete match και θα παραλειφθεί. Αυτό δεν αποδεικνύει ότι η Alice δεν έχει ηλικία· το dataset δεν περιέχει τέτοιο triple.
Αποφυγή λανθασμένης ταυτότητας
Τα RDF resources ταυτοποιούνται με IRIs. Ίδιο local suffix σε δύο διαφορετικά namespaces δεν σημαίνει ίδια ταυτότητα. Εξήγησε γιατί τα ex:alice και other:alice δεν συγχωνεύονται αυτόματα, ακόμα και αν το φιλικό τους label είναι ίδιο.
Αξιολόγηση
Τρέξε query σε dataset που περιλαμβάνει duplicate triples και εξήγησε set-based RDF graph έναντι bag-like SPARQL solution mappings. Πρόσθεσε OPTIONAL με FILTER(bound(?age)) και έλεγξε πώς μεταβάλλονται οι γραμμές. Κατάγραψε RDF store, query engine και πραγματικές εξόδους. Το παράδειγμα αποτελεί τεχνικό σενάριο προς επαλήθευση και όχι δηλωμένη επιτυχή εκτέλεση.