Οδηγός γλώσσας GQL για γράφημα στο Microsoft Fabric

Το GQL (Graph Query Language) είναι η τυποποιημένη γλώσσα ερωτημάτων ISO για βάσεις δεδομένων γραφημάτων. Χρησιμοποιήστε το GQL για να υποβάλετε ερωτήματα, να αναλύσετε και να εργαστείτε αποτελεσματικά με δεδομένα γραφήματος με το γράφημα στο Microsoft Fabric.

Η ίδια ομάδα εργασίας ISO που τυποποιεί την SQL αναπτύσσει GQL. Κατά συνέπεια, η GQL μοιράζεται πολλές έννοιες με την SQL, συμπεριλαμβανομένων παραστάσεων, κατηγορημάτων και τύπων δεδομένων. Εάν έχετε εμπειρία SQL, μπορείτε να εφαρμόσετε πολλές από τις γνώσεις σας στο GQL.

Αυτό το άρθρο παρέχει μια ολοκληρωμένη αναφορά για το GQL σε γράφημα. Καλύπτει τα εξής:

  • Βασικές έννοιες: Δομές δεδομένων γραφήματος, μοτίβα και βασικές έννοιες ερωτημάτων
  • Βασικές προτάσεις: MATCH, FILTER, LET, ORDER BY, και LIMITRETURN
  • Τύποι δεδομένων και παραστάσεις: Τύποι τιμών, τελεστές και ενσωματωμένες συναρτήσεις
  • Προηγμένες τεχνικές: Σύνθεση πολλαπλών καταστάσεων, εμβέλεια μεταβλητών και στρατηγικές συνάθροισης

Σημείωμα

Το επίσημο διεθνές πρότυπο για GQL είναι iso/IEC 39075 τεχνολογία πληροφοριών - γλώσσες βάσεων δεδομένων - GQL.

Εάν αναζητάτε οδηγίες για τις εργασίες αντί για μια πλήρη αναφορά γλώσσας, ανατρέξτε στους οδηγούς διαδικασιών:

Προϋποθέσεις

Προτού ξεκινήσετε, βεβαιωθείτε ότι είστε εξοικειωμένοι με αυτές τις έννοιες:

  • Βατική κατανόηση των βάσεων δεδομένων - Η εμπειρία με οποιοδήποτε σύστημα βάσης δεδομένων όπως σχεσιακό (SQL), NoSQL ή γράφημα είναι χρήσιμη.
  • Έννοιες γραφήματος - Κατανόηση των κόδων, των άκρων και των σχέσεων σε συνδεδεμένα δεδομένα.
  • Βασικά στοιχεία ερωτήματος - Γνώση βασικών εννοιών ερωτημάτων όπως το φιλτράρισμα, η ταξινόμηση και η συνάθροιση.

Προτεινόμενο φόντο:

  • Η εμπειρία με γλώσσες SQL ή openCypher διευκολύνει την εκμάθηση της σύνταξης GQL (αποτελούν τις ρίζες του GQL).
  • Η εξοικείωση με τη μοντελοποίηση δεδομένων σάς βοηθά με τη σχεδίαση σχήματος γραφήματος.
  • Κατανόηση της συγκεκριμένης περίπτωσης χρήσης για δεδομένα γραφήματος.

Τι χρειάζεστε:

  • Πρόσβαση σε έναν χώρο εργασίας γραφήματος με δυνατότητες ερωτημάτων.
  • Δείγμα δεδομένων ή προθυμία για εργασία με τα παραδείγματα κοινωνικών δικτύων μας.
  • Βασικό πρόγραμμα επεξεργασίας κειμένου για τη σύνταξη ερωτημάτων.

Φιλοδώρημα

Εάν δεν είστε εξοικειωμένοι με τις βάσεις δεδομένων γραφήματος, ξεκινήστε με την επισκόπηση μοντέλων δεδομένων γραφήματος προτού συνεχίσετε με αυτόν τον οδηγό.

Τι κάνει το GQL ξεχωριστό

Το GQL έχει σχεδιαστεί ειδικά για δεδομένα γραφήματος. Αυτή η σχεδίαση καθιστά φυσική και εύχρηστη την εργασία με συνδεδεμένες πληροφορίες.

Σε αντίθεση με την SQL, η οποία βασίζεται σε συνδέσμους πινάκων για την έκφραση σχέσεων, το GQL χρησιμοποιεί μοτίβα οπτικών γραφημάτων. Αυτά τα μοτίβα αντικατοπτρίζουν απευθείας τον τρόπο σύνδεσης των οντοτήτων, διευκολύνοντας την ανάγνωση και την αιτιολόγηση των ερωτημάτων.

Ας υποθέσουμε ότι θέλετε να βρείτε ανθρώπους και τους φίλους τους (άνθρωποι που γνωρίζονται) που γεννήθηκαν και οι δύο πριν από το 1999. Δείτε πώς το GQL εκφράζει αυτή τη συνθήκη χρησιμοποιώντας ένα μοτίβο οπτικού γραφήματος:

MATCH (person:Person)-[:knows]-(friend:Person)
WHERE person.birthday < 19990101 
  AND friend.birthday < 19990101
RETURN person.firstName || ' ' || person.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name

Αυτό το ερώτημα εντοπίζει φίλους (άτομα που γνωρίζονται) που γεννήθηκαν και οι δύο πριν από το 1999. Το μοτίβο (person:Person)-[:knows]-(friend:Person) εμφανίζει οπτικά τη δομή της σχέσης που αναζητάτε, όπως περίπου τη σχεδίαση ενός διαγράμματος των δεδομένων σας.

Βασικές έννοιες του GQL

Προτού εμβαθύνετε σε ερωτήματα, κατανοήστε αυτές τις βασικές έννοιες που αποτελούν το θεμέλιο του GQL:

  • Τα γραφήματα αποθηκεύουν τα δεδομένα σας ως κόμβους (οντότητες) και άκρα (σχέσεις), καθένα με ετικέτες και ιδιότητες.
  • Οι τύποι γραφημάτων ενεργούν όπως σχήματα, καθορίζοντας τους κόμβους και τα άκρα που μπορούν να υπάρχουν στο γράφημά σας.
  • Οι περιορισμοί είναι άλλοι κανόνες και περιορισμοί που επιβάλλουν οι τύποι γραφημάτων σε γραφήματα για την επιβολή της ακεραιότητας των δεδομένων.
  • Τα ερωτήματα χρησιμοποιούν προτάσεις όπως MATCH, FILTER, και RETURN για την επεξεργασία δεδομένων και την εμφάνιση αποτελεσμάτων.
  • Τα μοτίβα περιγράφουν τις δομές γραφήματος που θέλετε να βρείτε χρησιμοποιώντας διαισθητική σύνταξη απεικόνισης.
  • Οι παραστάσεις εκτελούν υπολογισμούς και συγκρίσεις στα δεδομένα σας, όμοια με παραστάσεις SQL.
  • Τα κατηγορήματα είναι παραστάσεις δυαδικής τιμής που φιλτράρουν τα αποτελέσματα μέσα σε ερωτήματα.
  • Οι τύποι τιμών ορίζουν ποια είδη τιμών μπορείτε να επεξεργαστείτε και αποθηκεύσετε.

Κατανόηση δεδομένων γραφήματος

Για να εργαστείτε αποτελεσματικά με το GQL, πρέπει να κατανοήσετε τον τρόπο με τον οποίο είναι δομημένα τα δεδομένα γραφήματος. Αυτή η βάση σάς βοηθά να γράφετε καλύτερα ερωτήματα και να μοντελοποιείτε αποτελεσματικά τα δεδομένα σας.

Κόμβοι και άκρα: τα δομικά στοιχεία

Στο GQL, εργάζεστε με γραφήματα ιδιοτήτων με ετικέτες. Ένα γράφημα αποτελείται από δύο τύπους στοιχείων:

  • Οι κόμβοι συνήθως αντιπροσωπεύουν τις οντότητες (τα "ουσιαστικά") στο σύστημά σας, όπως άτομα, οργανισμούς, δημοσιεύσεις ή προϊόντα. Είναι ανεξάρτητα αντικείμενα που υπάρχουν στον τομέα σας. Ορισμένες φορές, καλείτε επίσης vertices κόμφων.

  • Τα άκρα αντιπροσωπεύουν σχέσεις μεταξύ οντοτήτων (τα "ρήματα") - πώς συνδέονται και αλληλεπιδρούν οι οντότητές σας.

Για παράδειγμα, οι άνθρωποι γνωρίζονται μεταξύ τους (:knows), οργανισμοί που δραστηριοποιούνται σε συγκεκριμένες περιοχές (:operates) ή πελάτες που αγόρασαν προϊόντα (:purchased).
Ορισμένες φορές, καλείτε επίσης σχέσεις edges.

Κάθε στοιχείο γραφήματος έχει τα εξής χαρακτηριστικά:

  • Ένα εσωτερικό αναγνωριστικό που το προσδιορίζει με μοναδικό τρόπο
  • Μία ή περισσότερες ετικέτες - περιγραφικά ονόματα όπως Person ή knows. Στο γράφημα, τα άκρα έχουν πάντα ακριβώς μία ετικέτα.
  • Ιδιότητες - ζεύγη ονόματος-τιμής που αποθηκεύουν δεδομένα σχετικά με το στοιχείο (όπως firstName: "Alice" ή birthday: "19730108").

Πώς δομούνται τα γραφήματα

Κάθε ακμή συνδέει ακριβώς δύο κόμβους: μια αρχή και έναν στόχο. Αυτή η σύνδεση δημιουργεί τη δομή του γραφήματος και δείχνει πώς οι οντότητες σχετίζονται μεταξύ τους. Η κατεύθυνση των άκρων έχει σημασία, δηλαδή ποιος Personfollows άλλος Person δημιουργεί μια κατευθυνόμενη σχέση.

Σημείωμα

Το γράφημα αυτήν τη στιγμή δεν υποστηρίζει ανεπιθύμητα άκρα.

Τα γραφήματα ιδιοτήτων όπως υποστηρίζονται στο γράφημα είναι πάντα καλά μορφοποιημένα, το οποίο σημαίνει ότι κάθε άκρο συνδέει δύο έγκυρους κόμβους. Εάν δείτε ένα άκρο σε ένα γράφημα, και τα δύο τελικά σημεία του υπάρχουν στο ίδιο γράφημα.

Μοντέλα γραφήματος και τύποι γραφημάτων

Το μοντέλο γραφήματος περιγράφει τη δομή ενός γραφήματος. Λειτουργεί όπως ένα σχήμα βάσης δεδομένων για τον τομέα της εφαρμογής σας. Τα μοντέλα γραφήματος ορίζουν τα εξής:

  • Ποιοι κόμβοι και άκρα μπορούν να υπάρχουν
  • Ποιες ετικέτες και ιδιότητες μπορούν να έχουν
  • Πώς συνδέονται οι κόμβοι και τα άκρα

Τα μοντέλα γραφήματος εξασφαλίζουν επίσης την ακεραιότητα των δεδομένων μέσω περιορισμών, ιδιαίτερα στους βασικούς περιορισμούς κόμβων που καθορίζουν ποιες ιδιότητες προσδιορίζουν μοναδικά κάθε κόμβο.

Σημείωμα

Μπορείτε να καθορίσετε μοντέλα γραφήματος χρησιμοποιώντας την τυπική σύνταξη GQL. Σε αυτή την περίπτωση, ονομάζονται τύποι γραφημάτων.

Ένα πρακτικό παράδειγμα: κοινωνικό δίκτυο

Σε αυτή την τεκμηρίωση, ένα παράδειγμα κοινωνικού δικτύου απεικονίζει έννοιες GQL. Η κατανόηση αυτού του τομέα σάς βοηθά να ακολουθήσετε τα παραδείγματα και να εφαρμόσετε παρόμοια μοτίβα στα δικά σας δεδομένα.

Διάγραμμα που εμφανίζει το σχήμα κοινωνικού δικτύου.

Σημείωμα

Το παράδειγμα κοινωνικού δικτύου προέρχεται από το LDBC SNB (Στοιχείο αναφοράς κοινωνικών δικτύων LDBC) που δημοσιεύτηκε από την GDC (Graph Data Council). Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα "Το σημείο αναφοράς κοινωνικών δικτύων LDBC".

Οι οντότητες κοινωνικών δικτύων

Το κοινωνικό μας δίκτυο περιλαμβάνει αυτούς τους κύριους κόμβους, που αντιπροσωπεύουν οντότητες του τομέα:

Οι χρήστες έχουν προσωπικές πληροφορίες, όπως ονόματα, γενέθλια και φύλα. Ζουν σε πόλεις και σχηματίζουν κοινωνικές συνδέσεις.

Τα σημεία σχηματίζουν μια γεωγραφική ιεραρχία:

  • Πόλεις όπως η "Νέα Υόρκη" ή το "Λονδίνο"
  • Πλήρεις/περιοχές όπως "Ηνωμένες Πολιτείες" ή "Ηνωμένο Βασίλειο"
  • Ήπειροι όπως η "Βόρεια Αμερική" ή η "Ευρώπη"

Οργανισμοί όπου οι χρήστες αφιερώνουν χρόνο:

  • Πανεπιστήμια όπου οι άνθρωποι σπουδάζουν
  • Εταιρείες στις οποίες εργάζονται άτομα

Περιεχόμενο και συζητήσεις:

  • Φόρουμ με τίτλους που περιέχουν δημοσιεύσεις
  • Δημοσιεύσεις με περιεχόμενο, γλώσσα και προαιρετικές εικόνες
  • Σχόλια που απαντούν σε δημοσιεύσεις ή άλλα σχόλια
  • Ετικέτες που κατηγοριοποιούν περιεχόμενο και αντιπροσωπεύουν ενδιαφέροντα

Πώς συνδέονται τα πάντα

Οι συνδέσεις μεταξύ οντοτήτων καθιστούν το δίκτυο ενδιαφέρον:

  • Οι άνθρωποι γνωρίζονται (φιλία, :knows).
  • Άτομα εργάζονται σε εταιρείες (:workAt) ή σπουδάζουν σε πανεπιστήμια (:studyAt).
  • Οι χρήστες δημιουργούν δημοσιεύσεις και σχόλια (:hasCreator).
  • Στους χρήστες αρέσουν οι δημοσιεύσεις και τα σχόλια (:likes).
  • Οι δημοσιεύσεις, τα φόρουμ και τα σχόλια μπορούν να έχουν ετικέτες (:hasTag).
  • Τα άτομα έχουν ενδιαφέροντα για συγκεκριμένες ετικέτες (:hasInterest).
  • Τα φόρουμ περιέχουν δημοσιεύσεις (:containerOf) και έχουν μέλη (:hasMember) και επόπτες (:hasModerator).

Τα άκρα του γραφήματος αντιπροσωπεύουν σχέσεις τομέα. Αυτό το εμπλουτισμένο δίκτυο δημιουργεί πολλές ευκαιρίες για ενδιαφέροντα ερωτήματα και αναλύσεις.

Τα πρώτα σας ερωτήματα GQL

Τώρα που κατανοείτε τα βασικά στοιχεία του γραφήματος, ας δούμε πώς μπορείτε να υποβάλετε ερωτήματα για δεδομένα γραφήματος χρησιμοποιώντας GQL. Αυτά τα παραδείγματα δομούν από απλά σε σύνθετα, δείχνοντάς σας πώς η προσέγγιση του GQL καθιστά τα ερωτήματα γραφήματος εύχρηστα και ισχυρά.

Απλή εκκίνηση: εύρεση όλων των ατόμων

Ξεκινήστε με το πιο βασικό δυνατό ερώτημα. Βρείτε τα ονόματα (όνομα, επώνυμο) όλων των ατόμων:Person στο γράφημα.

MATCH (p:Person)
RETURN p.firstName, p.lastName

Αυτό το ερώτημα εκτελείται ως εξής:

  1. MATCH Εντοπίζει όλους τους κόμβους με την ετικέτα Person.
  2. RETURN εμφανίζει το όνομα και το επώνυμό τους.

Προσθήκη φιλτραρίσματος: εύρεση συγκεκριμένων ατόμων

Τώρα, βρείτε άτομα με συγκεκριμένα χαρακτηριστικά. Σε αυτήν την περίπτωση, βρείτε όλους τους χρήστες με το όνομα Alice και εμφανίστε τα ονόματα και τα γενέθλιά τους.

MATCH (p:Person)
FILTER p.firstName = 'Alice'
RETURN p.firstName, p.lastName, p.birthday

Αυτό το ερώτημα εκτελείται ως εξής:

  1. MATCH Εντοπίζει όλους τους κόμβους (p) με την ετικέτα Person.
  2. FILTER κόμβοι (p) των οποίων το όνομα είναι Alice.
  3. RETURN εμφανίζει το όνομα, το επώνυμο και τα γενέθλιά τους.

Βασική δομή ερωτήματος

Τα βασικά ερωτήματα GQL ακολουθούν όλα ένα συνεπές μοτίβο: μια ακολουθία δηλώσεων που συνεργάζονται για την εύρεση, το φιλτράρισμα και την επιστροφή δεδομένων. Τα περισσότερα ερωτήματα ξεκινούν με MATCH για να βρουν μοτίβα στο γράφημα και τελειώνουν με RETURN για να καθορίσουν την έξοδο.

Ακολουθεί ένα απλό ερώτημα που βρίσκει ζεύγη ατόμων που γνωρίζονται μεταξύ τους και έχουν τα ίδια γενέθλια και, στη συνέχεια, επιστρέφει τον συνολικό αριθμό αυτών των ζευγαριών φίλων.

MATCH (n:Person)-[:knows]-(m:Person)
FILTER n.birthday = m.birthday
RETURN count(*) AS same_age_friends

Αυτό το ερώτημα εκτελείται ως εξής:

  1. MATCH βρίσκει όλα τα ζεύγη Person κόδων που γνωρίζουν ο ένας τον άλλον.
  2. FILTER διατηρεί μόνο τα ζεύγη όπου και οι δύο έχουν τα ίδια γενέθλια.
  3. RETURN μετράει πόσα τέτοια ζευγάρια φίλων υπάρχουν.

Φιλοδώρημα

Μπορείτε επίσης να εκτελέσετε φιλτράρισμα απευθείας ως μέρος ενός μοτίβου προσαρτώντας έναν WHERE όρο. Για παράδειγμα, MATCH (n:Person WHERE n.age > 23) συμφωνεί μόνο με Person κόμβους των οποίων η age ιδιότητα είναι μεγαλύτερη από 23.

Το GQL υποστηρίζει σχόλια γραμμής στυλ // C, σχόλια γραμμής στυλ -- SQL και σχόλια μπλοκ στυλ /* */ C.

Κοινές δηλώσεις

  • MATCH: Προσδιορίζει το μοτίβο γραφήματος για αναζήτηση—εδώ ορίζετε τη δομή των δεδομένων που σας ενδιαφέρουν.
  • LET: Εκχωρεί νέες μεταβλητές ή υπολογισμένες τιμές με βάση αντιστοιχισμένα δεδομένα – προσθέτει παράγωγες στήλες στο αποτέλεσμα.
  • FILTER: Περιορίζει τα αποτελέσματα εφαρμόζοντας συνθήκες – καταργεί τις γραμμές που δεν πληρούν τα κριτήρια.
  • ORDER BY: Ταξινομεί τα φιλτραρισμένα δεδομένα – βοηθά στην οργάνωση της εξόδου με βάση ένα ή περισσότερα πεδία.
  • OFFSET και LIMIT: Περιορίστε τον αριθμό των γραμμών που επιστρέφονται—χρήσιμο για ερωτήματα σελιδοποίησης ή top-k.
  • RETURN: Καθορίζει το τελικό αποτέλεσμα – καθορίζει ποια δεδομένα πρέπει να συμπεριληφθούν στο σύνολο αποτελεσμάτων και εκτελεί συνάθροιση.

Πώς συνεργάζονται οι προτάσεις

Οι δηλώσεις GQL σχηματίζουν μια διοχέτευση, όπου κάθε δήλωση επεξεργάζεται την έξοδο της προηγούμενης. Αυτή η διαδοχική εκτέλεση καθιστά τα ερωτήματα εύκολα στην ανάγνωση και τον εντοπισμό σφαλμάτων, επειδή η σειρά εκτέλεσης ταιριάζει με τη σειρά ανάγνωσης.

Κύρια σημεία:

  • Οι δηλώσεις εκτελούνται αποτελεσματικά διαδοχικά.
  • Κάθε δήλωση μετασχηματίζει δεδομένα και τα μεταβιβάζει στην επόμενη.
  • Αυτή η διαδικασία δημιουργεί μια σαφή, προβλέψιμη ροή δεδομένων που απλοποιεί σύνθετα ερωτήματα.

Σημαντικό

Για μεγιστοποίηση των επιδόσεων, το γράφημα μπορεί να αναδιατάξετε την εκτέλεση δηλώσεων και να εκτελέσει μεμονωμένες προτάσεις παράλληλα. Αυτές οι βελτιστοποιήσεις δεν επηρεάζουν την ορθότητα των αποτελεσμάτων.

Παράδειγμα σύνθεσης πρότασης

Το ακόλουθο ερώτημα GQL βρίσκει τα πρώτα 10 άτομα που εργάζονται σε εταιρείες με το "Air" στο όνομά τους, τα ταξινομεί με βάση το πλήρες όνομα και επιστρέφει το πλήρες όνομά τους μαζί με το όνομα των εταιρειών τους.

-- Data flows: Match → Let → Filter → Order → Limit → Return
MATCH (p:Person)-[:workAt]->(c:Company)           -- Input: unit table, Output: (p, c) table
LET fullName = p.firstName || ' ' || p.lastName   -- Input: (p, c) table, Output: (p, c, fullName) table
FILTER c.name CONTAINS 'Air'                      -- Input: (p, c, fullName) table, Output: filtered table
ORDER BY fullName                                 -- Input: filtered table, Output: sorted table
LIMIT 10                                          -- Input: sorted table, Output: top 10 rows table
RETURN fullName, c.name AS companyName            -- Input: top 10 rows table
                                                  -- Output: projected (fullName, companyName) result table

Αυτό το ερώτημα εκτελείται ως εξής:

  1. MATCH βρίσκει άτομα που εργάζονται σε εταιρείες.
  2. LET Η δημιουργεί πλήρη ονόματα συνδυάζοντας το όνομα και τα ονόματα των οικογενειών.
  3. FILTER διατηρεί μόνο υπαλλήλους εταιρειών με «Air» στο όνομα της εταιρείας τους.
  4. ORDER BY ταξινομεί κατά πλήρες όνομα.
  5. LIMIT δέχεται τα πρώτα 10 αποτελέσματα.
  6. RETURN Επιστρέφει τα πλήρη ονόματα και τα ονόματα των εταιρειών.

Οι μεταβλητές συνδέουν τα δεδομένα σας

Οι μεταβλητές, όπως p, cκαι fullName στα προηγούμενα παραδείγματα, μεταφέρουν δεδομένα μεταξύ δηλώσεων. Όταν χρησιμοποιείτε ξανά ένα όνομα μεταβλητής, το GQL εξασφαλίζει αυτόματα ότι αναφέρεται στα ίδια δεδομένα, δημιουργώντας ισχυρές συνθήκες σύνδεσης. Οι μεταβλητές ορισμένες φορές ονομάζονται επίσης μεταβλητές σύνδεσης.

Μπορείτε να κατηγοριοποιήσετε μεταβλητές με διαφορετικούς τρόπους:

Κατά προέλευση σύνδεσης:

  • Μεταβλητές μοτίβου - συνδεδεμένες με αντιστοίχιση μοτίβων γραφήματος
  • Κανονικές μεταβλητές - δεσμευμένες από άλλες κατασκευές γλώσσας

Τύποι μεταβλητών μοτίβου:

  • Μεταβλητές στοιχείου - σύνδεση σε τιμές αναφοράς στοιχείων γραφήματος
    • Μεταβλητές κόμβου - σύνδεση σε μεμονωμένους κόμβους
    • Μεταβλητές edge - σύνδεση σε μεμονωμένα άκρα
  • Μεταβλητές διαδρομής - σύνδεση σε τιμές διαδρομής που αντιπροσωπεύουν αντιστοιχίες διαδρομών

Κατά βαθμό αναφοράς:

Αποτελέσματα και αποτελέσματα εκτέλεσης

Όταν εκτελείτε ένα ερώτημα, λαμβάνετε ένα αποτέλεσμα εκτέλεσης που αποτελείται από:

  • Ένας (προαιρετικός) πίνακας αποτελεσμάτων με τα δεδομένα από την πρόταση.RETURN
  • Πληροφορίες κατάστασης που εμφανίζουν εάν το ερώτημα ολοκληρώθηκε με επιτυχία ή όχι.

Πίνακες αποτελεσμάτων

Ο πίνακας που προκύπτει, εάν υπάρχει, είναι το πραγματικό αποτέλεσμα της εκτέλεσης του ερωτήματος.

Ένας πίνακας αποτελεσμάτων περιλαμβάνει πληροφορίες σχετικά με το όνομα και τον τύπο των στηλών του, μια προτιμώμενη ακολουθία ονόματος στήλης που θα χρησιμοποιηθεί για την εμφάνιση αποτελεσμάτων, εάν ο πίνακας είναι ταξινομημένος και τις ίδιες τις γραμμές.

Σημείωμα

Εάν αποτύχει η εκτέλεση, δεν περιλαμβάνεται πίνακας αποτελεσμάτων στο αποτέλεσμα εκτέλεσης.

Πληροφορίες κατάστασης

Κατά την εκτέλεση του ερωτήματος, η διαδικασία εντοπίζει διάφορες αξιοσημείωτες συνθήκες, όπως σφάλματα ή προειδοποιήσεις. Κάθε συνθήκη καταγράφεται από ένα αντικείμενο κατάστασης στις πληροφορίες κατάστασης του αποτελέσματος εκτέλεσης.

Οι πληροφορίες κατάστασης αποτελούνται από ένα αντικείμενο κύριας κατάστασης και μια (πιθανώς κενή) λίστα άλλων αντικειμένων κατάστασης. Το αντικείμενο κύριας κατάστασης υπάρχει πάντα και υποδεικνύει εάν η εκτέλεση του ερωτήματος ήταν επιτυχής ή απέτυχε.

Κάθε αντικείμενο κατάστασης περιλαμβάνει έναν πενταψήφιο κωδικό κατάστασης (που ονομάζεται GQLSTATUS) που αναγνωρίζει την καταγεγραμμένη συνθήκη και ένα μήνυμα που την περιγράφει.

Κωδικοί κατάστασης επιτυχίας:

GQLSTATUS Μήνυμα Όταν
00000 σημείωση: επιτυχής ολοκλήρωση Επιτυχία με τουλάχιστον μία γραμμή
00001 σημείωση: επιτυχής ολοκλήρωση - παραλείπεται αποτέλεσμα Επιτυχία χωρίς πίνακα (προς το παρόν δεν χρησιμοποιείται)
02000 σημείωση: δεν υπάρχουν δεδομένα Επιτυχία με μηδενικές γραμμές

Άλλοι κωδικοί κατάστασης υποδεικνύουν περαιτέρω σφάλματα ή προειδοποιήσεις που εντοπίζει η διαδικασία εκτέλεσης ερωτήματος.

Σημαντικό

Στον κώδικα εφαρμογής, να βασίζεστε πάντα σε κωδικούς κατάστασης για να ελέγχετε για ορισμένες συνθήκες. Οι κωδικοί κατάστασης είναι εγγυημένοι ότι είναι σταθεροί και η γενική σημασία τους δεν θα αλλάξει στο μέλλον. Μην κάνετε έλεγχο για τα περιεχόμενα των μηνυμάτων, καθώς το συγκεκριμένο μήνυμα που αναφέρεται για έναν κωδικό κατάστασης μπορεί να αλλάξει στο μέλλον, ανάλογα με το ερώτημα ή ακόμα και μεταξύ εκτελέσεων του ίδιου ερωτήματος.

Επιπλέον, τα αντικείμενα κατάστασης μπορεί να περιέχουν ένα υποκείμενο αντικείμενο κατάστασης αιτίας και μια εγγραφή διαγνωστικού ελέγχου με περισσότερες πληροφορίες που χαρακτηρίζουν την καταγεγραμμένη συνθήκη.

Βασικές έννοιες και δηλώσεις

Αυτή η ενότητα καλύπτει τα βασικά δομικά στοιχεία που χρειάζεστε για τη σύνταξη αποτελεσματικών ερωτημάτων GQL. Κάθε έννοια βασίζεται σε πρακτικές δεξιότητες γραφής ερωτημάτων.

Μοτίβα γραφήματος: εύρεση δομής

Τα μοτίβα γραφημάτων είναι η καρδιά των ερωτημάτων GQL. Σας επιτρέπουν να περιγράψετε τη δομή δεδομένων που αναζητάτε χρησιμοποιώντας διαισθητική, οπτική σύνταξη που μοιάζει με τις σχέσεις που θέλετε να βρείτε.

Απλά μοτίβα:

Ξεκινήστε με βασικά μοτίβα σχέσεων:

-- Find direct friendships
(p:Person)-[:knows]->(f:Person)

-- Find people working at any company
(p:Person)-[:workAt]->(c:Company)

-- Find cities in any country/region
(ci:City)-[:isPartOf]->(co:Country)  

Μοτίβα με συγκεκριμένα δεδομένα:

-- Find employees named Alice
(p:Person)-[:workAt]->(c:Company)
WHERE p.firstName = 'Alice'

-- Find friends who both have birthdays after December 31, 1999
(p:Person)-[:knows]->(f:Person)  
WHERE p.birthday > 19991231 AND f.birthday > 19991231

Παραστάσεις ετικέτας για ευέλικτη επιλογή οντότητας:

(:Person|Company)-[:isLocatedIn]->(p:City|Country)  -- OR with |
(:Place&City)                                       -- AND with &  
(:Person&!Company)                                  -- NOT with !

Σημείωμα

Οι κόμβοι μπορούν να έχουν πολλές ετικέτες, αλλά οι τύποι άκρου με πολλαπλές ετικέτες δεν υποστηρίζονται ακόμα.

Οι παραστάσεις ετικέτας σάς επιτρέπουν να αντιστοιχίζετε διαφορετικά είδη κόδων σε ένα μόνο μοτίβο, καθιστώντας τα ερωτήματά σας πιο ευέλικτα.

Η μεταβλητή επαναχρησιμοποίηση δημιουργεί ισχυρούς συνδέσμους:

-- Find coworkers: people who work at the same company
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c)

Η επαναχρησιμοποίηση της μεταβλητής c εξασφαλίζει ότι αμφότερα τα άτομα εργάζονται στην ίδια εταιρεία, δημιουργώντας έναν περιορισμό αυτόματης σύνδεσης. Αυτό το μοτίβο είναι ένα μοτίβο κλειδιού για την έκφραση σχέσεων "ίδιας οντότητας".

Σημαντικό

Κρίσιμες πληροφορίες: Η μεταβλητή επαναχρησιμοποίηση σε μοτίβα δημιουργεί δομικούς περιορισμούς. Χρησιμοποιήστε αυτή την τεχνική για να εκφράσετε σύνθετες σχέσεις γραφημάτων όπως "φίλοι που εργάζονται στην ίδια εταιρεία" ή "άτομα στην ίδια πόλη".

Φιλτράρισμα σε επίπεδο μοτίβου με το WHERE:

-- Filter during pattern matching (more efficient)
(p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)

-- Filter edges during matching  
(p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)

Μοτίβα οριοθέτησης μεταβλητού μήκους:

(:Person)-[:knows]->{1,3}(:Person)  -- Friends up to 3 degrees away

Λειτουργίες διαδρομής για τον έλεγχο της διέλευσης:

Οι λειτουργίες διαδρομής ελέγχουν τον τρόπο με τον οποίο η μηχανή ερωτημάτων χειρίζεται επαναλαμβανόμενα στοιχεία κατά τη διάρκεια διέλευσης μεταβλητού μήκους:

Λειτουργία διαδρομής Περιγραφή
WALK Επιτρέπει επαναλαμβανόμενους κόμβους και άκρα. Κανένας περιορισμός στη διέλευση.
TRAIL Δεν υπάρχουν επαναλαμβανόμενες άκρες, αλλά οι κόμβοι ενδέχεται να επαναληφθούν. Αυτή είναι η προεπιλεγμένη λειτουργία διαδρομής.
SIMPLE Δεν υπάρχουν επαναλαμβανόμενοι κόμβοι (εκτός από τον πρώτο και τον τελευταίο μπορεί να είναι ίσοι).
ACYCLIC Δεν υπάρχουν καθόλου επαναλαμβανόμενοι κόμβοι, εμποδίζοντας οποιονδήποτε κύκλο στη διαδρομή.

Χρησιμοποιήστε TRAIL μοτίβα για να αποτρέψετε κύκλους κατά τη διάρκεια της διέλευσης του γραφήματος, εξασφαλίζοντας ότι κάθε άκρο επισκέπτεται το πολύ μία φορά:

-- Find paths without visiting the same :knows edge twice
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS num_connections
-- Find acyclic paths in social networks
MATCH TRAIL (p:Person)-[e:knows]->{,3}(celebrity:Person)
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  celebrity.firstName || ' ' || celebrity.lastName AS celebrity_name, 
  count(e) AS distance
LIMIT 1000

Χρησιμοποιήστε ACYCLIC το όταν χρειάζεται να εγγυηθείτε ότι ο κόμβος επισκέπτεται δύο φορές:

-- Find paths where no person appears more than once
MATCH ACYCLIC (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice'
RETURN dst.firstName, dst.lastName
LIMIT 100

Σύνδεση άκρου μεταβλητού μήκους:

Σε μοτίβα μεταβλητού μήκους, οι μεταβλητές άκρου καταγράφουν διαφορετικές πληροφορίες με βάση το περιβάλλον:

-- Edge variable 'e' binds to a single edge for each result row
MATCH (p:Person)-[e:knows]->(friend:Person)
RETURN p.firstName, e.creationDate, friend.firstName  -- e refers to one specific relationship
LIMIT 1000

-- Edge variable 'e' binds to a group list of all edges in the path
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)  
RETURN 
  p.firstName || ' ' || p.lastName AS person_name, 
  friend.firstName || ' ' || friend.lastName AS friend_name, 
  -- e is a list
  size(e) AS num_edges
LIMIT 1000

Αυτή η διάκριση είναι καίριας σημασίας για τη σωστή χρήση των μεταβλητών άκρου.

Σύνθετα μοτίβα με πολλές σχέσεις:

MATCH (p:Person), (p)-[:workAt]->(c:Company), (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, p.lastName, c.name AS company_name, city.name AS city_name
LIMIT 1000

Αυτό το μοτίβο εντοπίζει άτομα μαζί με τον χώρο εργασίας και την κατοικία τους, εμφανίζοντας πώς ένα άτομο συνδέεται σε πολλές άλλες οντότητες.

Βασικές προτάσεις

Το GQL παρέχει συγκεκριμένους τύπους πρότασης που συνεργάζονται για την επεξεργασία των δεδομένων του γραφήματος σας βήμα προς βήμα. Η κατανόηση αυτών των δηλώσεων είναι απαραίτητη για τη δημιουργία αποτελεσματικών ερωτημάτων.

MATCH δήλωση

Σύνταξη:

MATCH <graph pattern>, <graph pattern>, ... [ WHERE <predicate> ]

Η MATCH πρόταση λαμβάνει δεδομένα εισόδου και εντοπίζει μοτίβα γραφημάτων. Συνδέει μεταβλητές εισόδου με μεταβλητές μοτίβου και εξάγει όλους τους αντιστοιχισμένους συνδυασμούς.

Μεταβλητές εισόδου και εξόδου:

-- Input: unit table (no columns, one row)
-- Pattern variables: p, c  
-- Output: table with (p, c) columns for each person-company match
MATCH (p:Person)-[:workAt]->(c:Company)

Φιλτράρισμα σε επίπεδο πρότασης χρησιμοποιώντας το WHERE:

-- Filter pattern matches
MATCH (p:Person)-[:workAt]->(c:Company) WHERE p.lastName = c.name

Μπορείτε να δημοσιεύσετε-φιλτράρετε όλες τις αντιστοιχίσεις χρησιμοποιώντας τη συνάρτηση WHERE. Αυτή η προσέγγιση αποτρέπει μια ξεχωριστή FILTER δήλωση.

Σύνδεση με τη χρήση μεταβλητών εισόδου:

Όταν MATCH δεν είναι η πρώτη πρόταση, συνδέει δεδομένα εισόδου με αντιστοιχίσεις μοτίβων:

...
-- Input: table with 'targetCompany' column
-- Implicit join: targetCompany (equality join)
-- Output: table with (targetCompany, p, r) columns
MATCH (p:Person)-[r:workAt]->(targetCompany)

Σημαντικό

Το γράφημα υποστηρίζει βασική και πλήρη γραμμική σύνθεση πρότασης (αλληλου χωνευμάτων MATCH, LET, FILTER, RETURNκαι άλλες βασικές δηλώσεις). Οι λειτουργίες set όπως UNION DISTINCT, EXCEPT, INTERSECT, και OTHERWISE δεν υποστηρίζονται ακόμα. Για περισσότερες πληροφορίες, ανατρέξτε στο άρθρο σχετικά με τους τρέχοντες περιορισμούς.

Συμπεριφορές σύνδεσης κλειδιού:

Πώς MATCH χειρίζεται τη σύνδεση δεδομένων:

  • Ισότητα μεταβλητών: Οι μεταβλητές εισόδου ενώνονται με μεταβλητές μοτίβου χρησιμοποιώντας αντιστοίχιση ισότητας
  • Εσωτερικός σύνδεσμος: Οι γραμμές εισόδου χωρίς αντιστοιχίσεις μοτίβων απορρίπτονται. Χρησιμοποιήστε το OPTIONAL MATCH για συμπεριφορά αριστερού εξωτερικού συνδέσμου.
  • Σειρά φιλτραρίσματος: Φίλτρα σε επίπεδο WHERE πρότασης μετά την ολοκλήρωση της αντιστοίχισης μοτίβων
  • Συνδεσιμότητα μοτίβων: Πολλά μοτίβα πρέπει να μοιράζονται τουλάχιστον μία μεταβλητή για τη σωστή σύνδεση
  • Επιδόσεις: Οι κοινόχρηστες μεταβλητές δημιουργούν αποτελεσματικούς περιορισμούς σύνδεσης

Σημαντικό

Περιορισμός: Εάν αυτή η MATCH πρόταση δεν είναι η πρώτη πρόταση, τουλάχιστον μία μεταβλητή εισόδου πρέπει να ενώσει με μια μεταβλητή μοτίβου. Τα πολλαπλά μοτίβα πρέπει να έχουν μία κοινή μεταβλητή.

Τα πολλαπλά μοτίβα απαιτούν κοινόχρηστες μεταβλητές:

-- Shared variable 'p' joins the two patterns
-- Output: people with both workplace and residence data
MATCH (p:Person)-[:workAt]->(c:Company), 
      (p)-[:isLocatedIn]->(city:City)

OPTIONAL MATCH δήλωση

Σύνταξη:

OPTIONAL MATCH <graph pattern> [ WHERE <predicate> ]

OPTIONAL MATCH Λειτουργεί όπως MATCH , αλλά χρησιμοποιεί σημασιολογία αριστερού-εξωτερικού συνδέσμου. Εάν το μοτίβο δεν συμφωνεί με μια γραμμή εισόδου, το ερώτημα διατηρεί τη γραμμή με NULL τιμές για μη αντιστοιχίες μεταβλητών, αντί να την απορρίπτει.

Παράδειγμα:

-- Find all people and, if available, their workplace
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company_name

Τα άτομα που δεν εργάζονται σε οποιαδήποτε εταιρεία εξακολουθούν να εμφανίζονται στα αποτελέσματα με NULL το για company_name.

Φιλοδώρημα

Χρησιμοποιήστε OPTIONAL MATCH την όταν θέλετε να συμπεριλάβετε οντότητες που μπορεί να μην έχουν μια συγκεκριμένη σχέση, παρόμοια με μια SQL LEFT JOIN.

LET δήλωση

Σύνταξη:

LET <variable> = <expression>, <variable> = <expression>, ...

Η LET πρόταση δημιουργεί υπολογισμένες μεταβλητές και επιτρέπει τον μετασχηματισμό δεδομένων εντός της διοχέτευσης ερωτημάτων σας.

Δημιουργία βασικής μεταβλητής:

MATCH (p:Person)
LET fullName = p.firstName || ' ' || p.lastName
RETURN *
LIMIT 1000

Σύνθετοι υπολογισμοί:

MATCH (p:Person)
LET adjustedAge = 2000 - (p.birthday / 10000),
    fullProfile = p.firstName || ' ' || p.lastName || ' (' || p.gender || ')'
RETURN *
LIMIT 1000

Συμπεριφορές κλειδιού:

  • Η μηχανή ερωτημάτων αξιολογεί παραστάσεις για κάθε γραμμή εισόδου.
  • Τα αποτελέσματα μετατρέπονται σε νέες στήλες στον πίνακα εξόδου.
  • Οι μεταβλητές μπορούν να αναφέρουν μόνο υπάρχουσες μεταβλητές από προηγούμενες προτάσεις.
  • Ο μηχανισμός ερωτημάτων αξιολογεί πολλές αναθέσεις σε μία LET πρόταση παράλληλα (χωρίς διασταυρούμενες αναφορές).

FILTER δήλωση

Σύνταξη:

FILTER [ WHERE ] <predicate>

Η FILTER πρόταση παρέχει ακριβή έλεγχο των δεδομένων που προχωρούν μέσω της διοχέτευσης ερωτημάτων σας.

Βασικό φιλτράρισμα:

MATCH (p:Person)
FILTER p.birthday < 19980101 AND p.gender = 'female'
RETURN *

Σύνθετες λογικές συνθήκες:

MATCH (p:Person)
FILTER (p.gender = 'male' AND p.birthday < 19940101) 
  OR (p.gender = 'female' AND p.birthday < 19990101)
  OR p.browserUsed = 'Edge'
RETURN *

Μοτίβα φιλτραρίσματος με επίγνωση null:

Χρησιμοποιήστε αυτά τα μοτίβα για να χειριστείτε με ασφάλεια τις τιμές null:

  • Έλεγχος για τιμές: p.firstName IS NOT NULL - έχει όνομα
  • Επικύρωση δεδομένων: p.id > 0 - έγκυρο αναγνωριστικό
  • Χειρισμός δεδομένων που λείπουν: NOT coalesce(p.locationIP, '10.x.x.x') STARTS WITH '10.x.x.x' - δεν συνδέεστε από το τοπικό δίκτυο
  • Συνδυασμός συνθηκών: Χρήση AND/OR με ρητούς ελέγχους null για σύνθετη λογική

Προσοχή

Να θυμάστε ότι οι συνθήκες που περιλαμβάνουν τιμές null επιστρέφουν UNKNOWN, το οποίο φιλτράρει αυτές τις γραμμές. Χρησιμοποιήστε ρητούς IS NULL ελέγχους όταν χρειάζεστε λογική συμπεριλαμβανομένης της null.

ORDER BY δήλωση

Σύνταξη:

ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ...

Ταξινόμηση πολλών επιπέδων με υπολογισμένες παραστάσεις:

MATCH (p:Person)
RETURN *
ORDER BY p.firstName DESC,               -- Primary: by first name (Z-A)
         p.birthday ASC,                 -- Secondary: by age (oldest first)
         p.id DESC                       -- Tertiary: by ID (highest first)

Χειρισμός null στην ταξινόμηση:

ORDER BY coalesce(p.gender, 'not specified') DESC -- Treat NULL as 'not specified'

Λεπτομέρειες συμπεριφοράς ταξινόμησης:

Κατανόηση του τρόπου ORDER BY λειτουργίας:

  • Ο μηχανισμός ερωτημάτων αξιολογεί παραστάσεις για κάθε γραμμή και, στη συνέχεια, τα αποτελέσματα καθορίζουν τη σειρά των γραμμών.
  • Πολλά κλειδιά ταξινόμησης δημιουργούν ιεραρχική σειρά (πρωτεύων, δευτερεύοντα, πρόσθια και ούτω καθεξής).
  • NULL Το είναι πάντα η μικρότερη τιμή στις συγκρίσεις.
  • ASC (αύξουσα) είναι η προεπιλεγμένη σειρά και πρέπει να καθορίσετε DESC ρητά (φθίνουσα).
  • Μπορείτε να ταξινομήσετε κατά υπολογιζόμενες τιμές, όχι μόνο αποθηκευμένες ιδιότητες.

Προσοχή

Μόνο η ακόλουθη πρόταση αμέσως μετά μπορεί να δει τη σειρά ταξινόμησης που ORDER BY καθορίζει. Επομένως, ORDER BY ακολουθούμενο από RETURN * δεν παράγεται ταξινομημένο αποτέλεσμα.

Συγκρίνω:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
ORDER BY r.creationDate DESC
/* intermediary result _IS_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
/* final result _IS_ _NOT_ guaranteed to be ordered here  */

με:

MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
/* intermediary result _IS_ _NOT_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
ORDER BY r.creationDate DESC
/* final result _IS_ guaranteed to be ordered here              */

Αυτή η διαφορά έχει άμεσες συνέπειες για τα ερωτήματα "Top-k": LIMIT πρέπει πάντα να ακολουθείτε την ORDER BY πρόταση που καθορίζει την προβλεπόμενη σειρά ταξινόμησης.

OFFSET και LIMIT δηλώσεις

Σύνταξη:

  OFFSET <offset> [ LIMIT <limit> ]
| LIMIT <limit>

Συνήθη μοτίβα:

-- Basic top-N query
MATCH (p:Person)
RETURN *
ORDER BY p.id DESC
LIMIT 10                                 -- Top 10 by ID

Σημαντικό

Για προβλέψιμα αποτελέσματα σελιδοποίησης, χρησιμοποιήστε ORDER BY πάντα πριν OFFSET και LIMIT για να εξασφαλίσετε συνεπή σειρά γραμμών σε όλα τα ερωτήματα.

RETURN: βασική προβολή αποτελέσματος

Σύνταξη:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

Η RETURN πρόταση παράγει την τελική έξοδο του ερωτήματός σας καθορίζοντας ποια δεδομένα εμφανίζονται στον πίνακα που προκύπτει.

Βασικό αποτέλεσμα:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday, 
       c.name

Χρήση ψευδώνυμων για λόγους σαφήνειας:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS first_name, 
       p.lastName AS last_name,
       c.name AS company_name

Συνδυασμός με ταξινόμηση και κορυφαία k:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name, 
       p.birthday AS birth_year, 
       c.name AS company
ORDER BY birth_year ASC
LIMIT 10

Διπλότυπος χειρισμός με χρήση της DISTINCT:

-- Remove duplicate combinations
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN DISTINCT p.gender, p.browserUsed, p.birthday AS birth_year
ORDER BY p.gender, p.browserUsed, birth_year

Συνδυασμός με συνάθροιση:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT p) AS employee_count

RETURN με GROUP BY: προβολή ομαδοποιημένων αποτελεσμάτων

Σύνταξη:

RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
GROUP BY <variable>, <variable>, ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]

Χρησιμοποιήστε το για να ομαδοποιήσετε GROUP BY γραμμές κατά κοινόχρηστες τιμές και να υπολογίσετε συναρτήσεις συγκεντρωτικών αποτελεσμάτων εντός κάθε ομάδας.

Βασική ομαδοποίηση με συνάθροιση:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, 
       count(*) AS employeeCount,
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName
ORDER BY employeeCount DESC

Ομαδοποίηση πολλών στηλών:

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS person_count,
       avg(p.birthday) AS avg_birth_year,
       min(p.creationDate) AS first_joined,
       max(p.id) AS highest_id
GROUP BY gender, browser
ORDER BY avg_birth_year DESC
LIMIT 10

Σημείωμα

Για προηγμένες τεχνικές συνάθροισης, συμπεριλαμβανομένης της οριζόντιας συνάθροισης σε μοτίβα μεταβλητού μήκους, ανατρέξτε στο θέμα Τεχνικές σύνθετης συνάθροισης.

Τύποι δεδομένων: εργασία με τιμές

Το GQL υποστηρίζει εμπλουτισμένους τύπους δεδομένων για την αποθήκευση και τον χειρισμό διαφορετικών ειδών πληροφοριών στο γράφημό σας.

Βασικοί τύποι τιμών

  • Αριθμοί: INT64, UINT64( FLOAT64 ονομάζεται DOUBLEεπίσης ) για υπολογισμούς και μετρήσεις
  • Κείμενο: STRING για ονόματα, περιγραφές και δεδομένα κειμένου
  • Λογική: BOOL με τρεις τιμές: TRUE, FALSE και UNKNOWN (για χειρισμό null)
  • Ώρα: ZONED DATETIME για χρονικές σημάνσεις με πληροφορίες ζώνης ώρας
  • Συλλογές: LIST<T> για πολλαπλές τιμές του ίδιου τύπου T, PATH για αποτελέσματα διέλευσης γραφήματος
  • Στοιχεία γραφήματος: NODE και EDGE για την αναφορά δεδομένων γραφήματος

Σημαντικό

Δεν μπορείτε να χρησιμοποιήσετε συγκεκριμένους τύπους τιμών ως τους τύπους τιμών ιδιοτήτων. Συγκεκριμένα, δεν μπορείτε να χρησιμοποιήσετε τιμές που αφορούν τιμές αναφοράς στοιχείων γραφήματος ως τιμές ιδιοτήτων (όπως λίστες κόδων ή διαδρομών).

Παραδείγματα λεκτικών σταθερών

42                                     -- Integer literal
"Hello, graph!"                        -- String  literal
TRUE                                   -- Boolean literal
ZONED_DATETIME('2024-01-15T10:30:00Z') -- DateTime with timezone literakl
[1, 2, 3]                              -- Literal list of integers

Κρίσιμα μοτίβα χειρισμού null

-- Equality predicates with NULL always returns UNKNOWN
5 = NULL                              -- Evaluates to UNKNOWN (not FALSE!)
NULL = NULL                           -- Evaluates to UNKNOWN (not TRUE!)

-- Use IS NULL predicates for explicit null testing
p.nickname IS NULL                    -- Evaluates to TRUE if nickname is null
p.nickname IS NOT NULL                -- Evaluates to TRUE if nickname has a value

-- Use the COALESCE function for null-safe value selection
coalesce(p.nickname, p.firstName, '???')  -- Evaluates to first non-null value

Επιπτώσεις λογικής τριών τιμών

-- In FILTER statements, only TRUE values pass through
FILTER p.birthday > 0        -- Removes rows where birthday is null or missing or zero

-- It's important to understand that NOT UNKNOWN = UNKNOWN
FILTER NOT (p.birthday > 0)  -- Removes rows where birthday is null or missing or positive

-- Use explicit null handling for inclusive filtering
FILTER p.birthday < 19980101 OR p.birthday IS NULL -- Includes null birthdays

Προσοχή

Λογική τριών τιμών σημαίνει NULL = NULL επιστρέφει UNKNOWN, όχι TRUE. Αυτή η συμπεριφορά επηρεάζει το φιλτράρισμα και τους συνδέσμους. Να χρησιμοποιείται IS NULL πάντα για δοκιμές null.

Παραστάσεις: μετασχηματισμός και ανάλυση δεδομένων

Οι παραστάσεις σάς επιτρέπουν να υπολογίζετε, να συγκρίνετε και να μετασχηματίζετε δεδομένα μέσα στα ερωτήματά σας. Μοιάζουν με παραστάσεις στην SQL, αλλά έχουν επιπλέον δυνατότητες για τον χειρισμό δεδομένων γραφήματος.

Συνήθεις τύποι παράστασης

p.birthday < 19980101   -- Birth year comparison  
p.firstName || ' ' || p.lastName               -- String concatenation
count(*)                                       -- Aggregation
p.firstName IN ['Alice', 'Bob']                -- List membership
coalesce(p.firstName, p.lastName)              -- Null handling

Σύνθετη κατηγόρημα σύνθεση

-- Combine conditions with proper precedence
FILTER (p.birthday > 19560101 AND p.birthday < 20061231) 
  AND ((p.gender IN ['male', 'female']) OR (p.browserUsed IS NOT NULL))

-- Use parentheses for clarity and correctness
FILTER p.gender = 'female' AND (p.firstName STARTS WITH 'A' OR p.id > 1000)

Αντιστοίχιση μοτίβου συμβολοσειράς

-- Pattern matching with different operators
p.locationIP CONTAINS '192.168'      -- Substring search
p.firstName STARTS WITH 'John'       -- Prefix matching  
p.lastName ENDS WITH 'son'           -- Suffix matching

-- Case-insensitive operations
upper(p.firstName) = 'ALICE'         -- Convert to uppercase for comparison

Ενσωματωμένες συναρτήσεις ανά κατηγορία

Το GQL παρέχει αυτές τις κατηγορίες συναρτήσεων για διαφορετικές ανάγκες επεξεργασίας δεδομένων:

  • Συναρτήσεις συγκεντρωτικών αποτελεσμάτων: count(), sum(), avg(), min(), max() για τη σύνοψη δεδομένων

  • Παραστάσεις υπό όρους: CASE/WHEN/THEN/ELSE/END και NULLIF() για λογική υπό όρους. Για παράδειγμα:

    MATCH (p:Person)
    RETURN p.firstName,
      CASE WHEN p.birthday < 20000101 THEN 'Before 2000' ELSE '2000 or later' END AS era,
      NULLIF(p.gender, 'unknown') AS gender
    
  • Συναρτήσεις συμβολοσειράς: char_length(), upper(), lower()trim() για επεξεργασία κειμένου (US ASCII μόνο για αντιστοίχιση υποθέσεων)

  • Συναρτήσεις γραφήματος: nodes(), edges(), elements(), labels(), path_length() για την ανάλυση δομών γραφήματος

  • Γενικές συναρτήσεις: coalesce(), to_json_string() για τον χειρισμό τιμών null και σειριοποίησης

Προτεραιότητα τελεστών για σύνθετες παραστάσεις

  1. Πρόσβαση ιδιότητας (.)
  2. Πολλαπλασιασμός και διαίρεση (*, /)
  3. Πρόσθεση και αφαίρεση (+, -)
  4. Σύγκριση (=, <>, , <>, <=, >=)
  5. Λογική άρνηση (NOT)
  6. Λογική σύνδεση (AND)
  7. Λογική αποκλειστική αποσύνδεση (XOR)
  8. Λογική αποσύνδεση (OR)

Στην προηγούμενη λίστα, ένας τελεστής με μικρότερο αριθμό "συνδέεται πιο σφιχτά" από έναν τελεστή με μεγαλύτερο αριθμό. Για παράδειγμα, το είναι NOT n.prop OR m.prop αλλά (NOT n.prop) OR m.prop όχιNOT (n.prop OR m.prop).

Φιλοδώρημα

Χρησιμοποιήστε παρενθέσεις για να κάνετε ρητή την προτεραιότητα. Οι σύνθετες παραστάσεις είναι πιο ευανάγνωστες και ο εντοπισμός σφαλμάτων όταν η ομαδοποίηση είναι σαφής.

Προηγμένες τεχνικές ερωτημάτων

Αυτή η ενότητα καλύπτει εξελιγμένα μοτίβα και τεχνικές για τη δημιουργία σύνθετων, αποτελεσματικών ερωτημάτων γραφημάτων. Αυτά τα μοτίβα υπερβαίνουν τη χρήση βασικής πρότασης για να σας βοηθήσουν να συντάξετε ισχυρά αναλυτικά ερωτήματα.

Σύνθετη σύνθεση πολλαπλών πολιτειών

Σημαντικό

Το γράφημα υποστηρίζει βασική και πλήρη γραμμική σύνθεση δήλωσης. Οι λειτουργίες set όπως UNION DISTINCT, EXCEPT, INTERSECT, και OTHERWISE δεν υποστηρίζονται ακόμα. Για περισσότερες πληροφορίες, ανατρέξτε στο άρθρο σχετικά με τους τρέχοντες περιορισμούς.

Η κατανόηση του τρόπου αποτελεσματικής σύνταξης σύνθετων ερωτημάτων είναι καίριας σημασίας για την υποβολή σύνθετων ερωτημάτων σε γραφήματα.

UNION ALL

Χρησιμοποιήστε UNION ALL το για να συνδυάσετε αποτελέσματα από δύο ή περισσότερα γραμμικά στοιχεία επιπέδου μπλοκ ερωτημάτων:

-- Combine results from two separate pattern matches
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS name, c.name AS affiliation
UNION ALL
MATCH (p:Person)-[:studyAt]->(u:University)
RETURN p.firstName AS name, u.name AS affiliation

UNION ALL Διατηρεί όλες τις γραμμές, συμπεριλαμβανομένων των διπλότυπων. UNION DISTINCT (το οποίο καταργεί τα διπλότυπα) δεν υποστηρίζεται ακόμα.

Εξέλιξη μοτίβου πολλών βημάτων

Αλυσιδωτές πολλαπλές προτάσεις για σταδιακή δημιουργία σύνθετης ανάλυσης:

-- Build complex analysis step by step
MATCH (company:Company)<-[:workAt]-(employee:Person)
LET companyName = company.name
MATCH (employee)-[:isLocatedIn]->(city:City)
FILTER employee.birthday < 19850101
LET cityName = city.name
RETURN companyName, cityName, avg(employee.birthday) AS avgBirthday, count(employee) AS employeeCount
GROUP BY companyName, cityName
ORDER BY avgBirthday DESC

Αυτό το ερώτημα δημιουργεί σταδιακά πολυπλοκότητα: βρείτε εταιρείες, τους υπαλλήλους τους, τις τοποθεσίες των εργαζομένων, φιλτράρετε εταιρείες με υπαλλήλους που γεννήθηκαν πριν από το 1985, υπολογίστε τα μέσα γενέθλια και συνοψίστε και ταξινομήστε τα αποτελέσματα.

Χρήση οριζόντιας συνάθροισης

Συγκεντρώσεις οριζόντιας συνάθροισης σε μοτίβα μεταβλητού μήκους μέσα σε μία μόνο γραμμή:

-- Find people and their minimum distance to people working at Microsoft
MATCH TRAIL (p:Person)-[e:knows]->{,5}(:Person)-[:workAt]->(:Company { name: 'Microsoft'})
LET p_name = p.lastName || ', ' || p.firstName
RETURN p_name, min(count(e)) AS minDistance 
GROUP BY p_name
ORDER BY minDistance DESC

Σημείωμα

Αυτό το ερώτημα δεν υποστηρίζεται ακόμα (γνωστό ζήτημα).

Εμβέλεια μεταβλητών και στοιχείο ελέγχου ροής για προχωρημένους

Οι μεταβλητές συνδέουν δεδομένα σε προτάσεις ερωτημάτων και ενεργοποιούν σύνθετες διασχίσεις γραφημάτων. Η κατανόηση των σύνθετων κανόνων εμβέλειας σάς βοηθά να γράφετε εξελιγμένα ερωτήματα πολλαπλών δηλώσεων.

Μοτίβα σύνδεσης και εμβέλειας μεταβλητών

-- Variables flow forward through subsequent statements 
MATCH (p:Person)                                    -- Bind p 
LET fullName = p.firstName || ' ' || p.lastName     -- Bind concatenation of p.firstName and p.lastName as fullNume
FILTER fullName CONTAINS 'Smith'                    -- Filter for fullNames with “Smith” substring (p is still bound)
RETURN p.id, fullName                               -- Only return p.id and fullName (p is dropped from scope) 

Επαναχρησιμοποίηση μεταβλητής για ενώσεις σε όλες τις προτάσεις

-- Multi-statement joins using variable reuse
MATCH (p:Person)-[:workAt]->(:Company)          -- Find people with jobs
MATCH (p)-[:isLocatedIn]->(:City)               -- Same p: people with both job and residence
MATCH (p)-[:knows]->(friend:Person)             -- Same p: their social connections
RETURN *

Κρίσιμοι κανόνες και περιορισμοί εμβέλειας

-- ✅ Backward references work
MATCH (p:Person)
LET adult = p.birthday < 20061231  -- Can reference p from previous statement
RETURN *

-- ❌ Forward references don't work  
LET adult = p.birthday < 20061231  -- Error: p not yet defined
MATCH (p:Person)
RETURN *

-- ❌ Variables in same LET statement can't reference each other
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName,
    greeting = 'Hello, ' || name     -- Error: name not visible yet
RETURN *

-- ✅ Use separate statements for dependent variables
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName
LET greeting = 'Hello, ' || name     -- Works: name now available
RETURN *

Ορατότητα μεταβλητών σε σύνθετα ερωτήματα

-- Variables remain visible until overridden or query ends
MATCH (p:Person)                     -- p available from here
LET gender = p.gender                -- gender available from here  
MATCH (p)-[:knows]->(e:Person)       -- p still refers to original person
                                     -- e is new variable for managed employee
RETURN p.firstName AS manager, e.firstName AS friend, gender

Προσοχή

Οι μεταβλητές στην ίδια πρόταση δεν μπορούν να αναφέρονται μεταξύ τους, εκτός από τα μοτίβα γραφημάτων. Χρησιμοποιήστε ξεχωριστές προτάσεις για τη δημιουργία εξαρτώμενων μεταβλητών.

Προηγμένες τεχνικές συνάθροισης

Το GQL υποστηρίζει δύο διακριτούς τύπους συνάθροισης για την ανάλυση δεδομένων σε ομάδες και συλλογές: κατακόρυφη συνάθροιση με GROUP BY και οριζόντια συνάθροιση σε μοτίβα μεταβλητού μήκους.

Κατακόρυφη συνάθροιση με ΟΜΑΔΟΠΟΊΗΣΗ ΚΑΤΑ

Η κατακόρυφη συνάθροιση (που καλύπτεται RETURN με GROUP BY) ομαδοποιεί γραμμές κατά κοινόχρηστες τιμές και υπολογίζει συγκεντρωτικές τιμές εντός κάθε ομάδας:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN c.name AS companyName, 
       count(*) AS employee_count, 
       avg(p.birthday) AS avg_birth_year
GROUP BY companyName

Αυτή η προσέγγιση δημιουργεί μία γραμμή αποτελεσμάτων ανά εταιρεία, συναθροίζοντας όλους τους υπαλλήλους σε κάθε ομάδα.

Οριζόντια συνάθροιση με μεταβλητές λίστας ομάδων

Η οριζόντια συνάθροιση υπολογίζει συγκεντρωτικές τιμές σε συλλογές που συνδέονται με μοτίβα μεταβλητού μήκους. Όταν χρησιμοποιείτε άκρα μεταβλητού μήκους, η μεταβλητή άκρου μετατρέπεται σε μεταβλητή λίστας ομάδων που περιέχει όλα τα άκρα σε κάθε αντιστοιχισμένη διαδρομή:

-- Group list variable 'edges' enables horizontal aggregation
MATCH (p:Person)-[edges:knows]->{2,4}(friend:Person)
RETURN p.firstName || ' ' || p.lastName AS person_name, 
       friend.firstName || ' ' || friend.lastName AS friend_name,
       size(edges) AS degrees_of_separation,
       avg(edges.creationDate) AS avg_connection_age,
       min(edges.creationDate) AS oldest_connection

Σημείωμα

Αυτό το ερώτημα δεν υποστηρίζεται ακόμα (γνωστό ζήτημα).

Οι βασικές διαφορές μεταξύ κατακόρυφης και οριζόντιας συνάθροισης είναι οι εξής:

  • Η κατακόρυφη συνάθροιση συνοψίζει σε γραμμές ή ομαδοποιεί γραμμές και συνοψίζει σε όλες τις γραμμές κάθε ομάδας.
  • Η οριζόντια συνάθροιση συνοψίζει στοιχεία εντός μεμονωμένων συλλογών άκρου.
  • Οι μεταβλητές λίστας ομάδων προέρχονται μόνο από μοτίβα άκρου μεταβλητού μήκους.

Περιβάλλοντα σύνδεσης άκρου μεταβλητού μήκους

Η κατανόηση του τρόπου σύνδεσης των μεταβλητών άκρου σε μοτίβα μεταβλητού μήκους είναι καίριας σημασίας:

Κατά τη διάρκεια της αντιστοίχισης μοτίβων (περιβάλλον singleton):

-- Edge variable 'e' refers to each individual edge during filtering
MATCH (p:Person)-[e:knows WHERE e.creationDate > zoned_datetime('2000-01-01T00:00:00Z')]->{2,4}(friend:Person)
-- 'e' is evaluated for each edge in the path during matching
RETURN *

Σε παραστάσεις αποτελεσμάτων (περιβάλλον ομάδας):

-- Edge variable 'edges' becomes a list of all qualifying edges
MATCH (p:Person)-[e:knows]->{2,4}(friend:Person)
RETURN size(e) AS num_edges,                    -- Number of edges in path
       e[0].creationDate AS first_edge,         -- First edge in path
       avg(e.creationDate) AS avg_age           -- Horizontal aggregation

Σημείωμα

Αυτό το ερώτημα δεν υποστηρίζεται ακόμα (γνωστό ζήτημα).

Συνδυασμός κατακόρυφης και οριζόντιας συνάθροισης

Μπορείτε να συνδυάσετε και τους δύο τύπους συνάθροισης σε εξελιγμένα μοτίβα ανάλυσης:

Σημείωμα

Αυτό το ερώτημα δεν υποστηρίζεται ακόμα (γνωστό ζήτημα).

-- Find average connection age by city pairs
MATCH (p1:Person)-[:isLocatedIn]->(c1:City)
MATCH (p2:Person)-[:isLocatedIn]->(c2:City)
MATCH (p1)-[e:knows]->{1,3}(p2)
RETURN c1.name AS city1,
       c2.name AS city2,
       count(*) AS connection_paths,                  -- Vertical: count paths per city pair
       avg(size(e)) AS avg_degrees,                   -- Horizontal then vertical: path lengths
       avg(avg(e.creationDate)) AS avg_connection_age -- Horizontal then vertical: connection ages
GROUP BY city1, city2

Φιλοδώρημα

Η οριζόντια συνάθροιση έχει πάντα προτεραιότητα έναντι της κατακόρυφης συνάθροισης. Για να μετατρέψετε μια λίστα ομάδας σε κανονική λίστα, χρησιμοποιήστε collect_list(edges).

Σημείωμα

Για λεπτομερή αναφορά συναρτήσεων συγκεντρωτικών αποτελεσμάτων, ανατρέξτε στο θέμα Παραστάσεις και συναρτήσεις GQL.

Στρατηγικές χειρισμού σφαλμάτων

Η κατανόηση συνήθων μοτίβων σφαλμάτων σάς βοηθά να συντάξετε ισχυρά ερωτήματα.

Χειριστείτε τα δεδομένα που λείπουν με χάρη:

MATCH (p:Person)
-- Use COALESCE for missing properties
LET displayName = coalesce(p.firstName, p.lastName, 'Unknown')
LET contact = coalesce(p.locationIP, p.browserUsed, 'No info')
RETURN *

Χρήση ρητών ελέγχων null:

MATCH (p:Person)
-- Be explicit about null handling
FILTER p.id IS NOT NULL AND p.id > 0
-- Instead of just: FILTER p.id > 0
RETURN *

Πρόσθετες πληροφορίες

Κωδικοί GQLSTATUS

Όπως εξηγείται στην ενότητα σχετικά με τα αποτελέσματα των ερωτημάτων, το GQL αναφέρει πληροφορίες εμπλουτισμένης κατάστασης που σχετίζονται με την επιτυχία ή την πιθανή αποτυχία εκτέλεσης. Ανατρέξτε στην αναφορά κωδικών κατάστασης GQL για την πλήρη λίστα.

Δεσμευμένες λέξεις

Το GQL διατηρεί ορισμένες λέξεις-κλειδιά που δεν μπορείτε να χρησιμοποιήσετε ως αναγνωριστικά, όπως μεταβλητές, ονόματα ιδιοτήτων ή ονόματα ετικετών. Ανατρέξτε στην αναφορά δεσμευμένων λέξεων GQL για την πλήρη λίστα.

Εάν θέλετε να χρησιμοποιήσετε δεσμευμένες λέξεις ως αναγνωριστικά, χρησιμοποιήστε τις με βαρείες: `match`, `return`.

Για να αποφύγετε τη διαφυγή από δεσμευμένες λέξεις, χρησιμοποιήστε αυτήν τη σύμβαση ονομασίας:

  • Για αναγνωριστικά μίας λέξης, προσαρτήστε έναν χαρακτήρα υπογράμμισης: :Product_
  • Για αναγνωριστικά πολλών λέξεων, χρησιμοποιήστε camelCase ή PascalCase: :MyEntity, :hasAttribute, textColor

Επόμενα βήματα

Τώρα που κατανοείτε τα βασικά στοιχεία του GQL, ακολουθεί ο συνιστώμενος μαθησιακός δίαυλος σας:

Συνεχίστε να δημιουργείτε τις δεξιότητές σας GQL

Για αρχάριους:

Για έμπειρους χρήστες:

Υλικά αναφοράς

Διατηρήστε αυτές τις αναφορές εύχρηστες για γρήγορες αναζητήσεις:

Εξερεύνηση γραφήματος

Μάθετε την πλατφόρμα:

Εμπλακείτε

  • Κοινή χρήση σχολίων - Βοηθήστε στη βελτίωση της τεκμηρίωσης και των εργαλείων
  • Συμμετοχή στην κοινότητα - Σύνδεση με άλλους χρήστες της βάσης δεδομένων γραφημάτων
  • Παραμείνετε ενημερωμένοι - Ακολουθήστε τις ανακοινώσεις του γραφήματος για νέες δυνατότητες

Φιλοδώρημα

Ξεκινήστε με το πρόγραμμα εκμάθησης γρήγορης εκκίνησης εάν προτιμάτε την εκμάθηση κάνοντας ή εμβαθύνετε σε μοτίβα γραφημάτων εάν θέλετε να μάθετε πρώτα τη γλώσσα ερωτημάτων.

Οδηγοί διαδικασιών:

Περισσότερες λεπτομέρειες σχετικά με βασικά θέματα:

Γρήγορες αναφορές:

Γράφημα: