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

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

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

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

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

Σημείωμα

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

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

Χρησιμοποιήστε τα εστιασμένα άρθρα αναφοράς όταν χρειάζεστε πλήρεις λεπτομέρειες:

Πληροφορίες που απαιτούνται Οριστικό άρθρο
Η σύνταξη με μια ματιά Γρήγορη αναφορά GQL
Σύνταξη σύνθεσης κόμβου, ακμής, διαδρομής και μοτίβου Μοτίβα γραφημάτων GQL
Τελεστές, κατηγορήματα και συναρτήσεις Παραστάσεις GQL, κατηγορήματα και συναρτήσεις
Κυριολεκτική σύνταξη, συμπεριφορά τιμών και μετατροπές τύπων Τιμές GQL και τύποι τιμών
Ορισμοί και περιορισμοί τύπου γραφήματος Τύποι γραφήματος GQL
Τρέχουσα κάλυψη χαρακτηριστικών ISO GQL Συμμόρφωση με το πρότυπο GQL
Τρέχοντες περιορισμοί και όρια ειδικά για το Fabric Τρέχοντες περιορισμοί

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

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

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

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

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

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

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

Φιλοδώρημα

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

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

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

Για παράδειγμα, το παρακάτω ερώτημα βρίσκει ζεύγη ανθρώπων που γνωρίζονται μεταξύ τους και γεννήθηκαν και οι δύο πριν από το 1999:

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

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

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

Αυτές οι έννοιες αποτελούν τη βάση της GQL:

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

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

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

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

Ένα γράφημα ιδιοτήτων με ετικέτα περιέχει δύο είδη στοιχείων γραφήματος:

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

Κάθε στοιχείο γραφήματος έχει μια εσωτερική ταυτότητα, μία ή περισσότερες ετικέτες και ένα σύνολο ιδιοτήτων. Οι σημάνσεις ταξινομούν στοιχεία, όπως Person ή knows. Οι ιδιότητες είναι ζεύγη ονόματος-τιμής, όπως firstName: 'Alice' ή birthday: 19730108u. Στο Graph, μια ακμή έχει πάντα ακριβώς μία ετικέτα.

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

Σημείωμα

Το Graph προς το παρόν δεν υποστηρίζει τη δημιουργία μη κατευθυνόμενων άκρων. Μπορείτε να υποβάλετε ερώτημα σε ένα υπάρχον κατευθυνόμενο άκρο προς οποιαδήποτε κατεύθυνση, χρησιμοποιώντας ένα μοτίβο οποιουδήποτε κατευθυνόμενου άκρου, -[:knows]-όπως .

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

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

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

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

Παράδειγμα γραφήματος που χρησιμοποιείται σε αυτόν τον οδηγό

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

Το δείγμα γραφήματος συνδέει αυτές τις περιοχές:

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

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

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

Τα πρώτα σας ερωτήματα 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.birthday < 19900101) το αντιστοιχεί μόνο Person σε κόμβους με τιμή πριν από το birthday 1990.

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

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

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

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

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

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

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

Σημείωμα

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

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

Το ακόλουθο ερώτημα 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 - σύνδεση σε μεμονωμένα άκρα
  • Μεταβλητές διαδρομής - σύνδεση σε τιμές διαδρομής που αντιπροσωπεύουν αντιστοιχίες διαδρομών

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

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

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

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

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

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

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

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

Σημείωμα

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

Παραλείπονται αποτελέσματα

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

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

Το Graph διατηρεί τα αποτελέσματα που παραλείπονται για μελλοντική υποστήριξη δήλωσης γλώσσας ορισμού δεδομένων (DDL) και γλώσσας χειρισμού δεδομένων (DML). Οι τρέχουσες προτάσεις ερωτήματος παράγουν αποτελέσματα πίνακα, συμπεριλαμβανομένων των κενών πινάκων.

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

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

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

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

Το API ερωτήματος χρησιμοποιεί τους ακόλουθους κύριους κωδικούς κατάστασης:

Κωδικός κατάστασης API Έννοια
00000 Επιτυχής ολοκλήρωση με τουλάχιστον μία γραμμή.
00001 Επιτυχής ολοκλήρωση με παράλειψη αποτελέσματος. Προορίζεται για μελλοντική υποστήριξη DDL και DML.
01000 Μια προειδοποίηση ή μια ενημερωτική συνθήκη.
02000 Προς το παρόν, δεν υπάρχουν διαθέσιμες γραμμές από ένα ερώτημα παραγωγής γραμμών.
42000 Ένα σφάλμα ερωτήματος που μπορεί να διορθωθεί από το χρήστη.
50000 Σφάλμα συστήματος ή μη ταξινομημένο.

Το API διατηρεί την κανονική κατάσταση GQLSTATUS που αναφέρεται από τη μηχανή ερωτημάτων στο _graphaneGqlStatus μέλος της διαγνωστικής εγγραφής. Για παράδειγμα, η αριθμητική υπερχείλιση χρησιμοποιεί την κανονική κατάσταση GQL, 22003ενώ η διαίρεση με το μηδέν χρησιμοποιεί 22012; και οι δύο αντιπροσωπεύονται από 42000 στο δημόσιο status.code πεδίο.

Σημαντικό

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

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

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

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

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

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

MATCH (person:Person)-[employment:workAt]->(company:Company)
RETURN person.firstName, company.name, employment.workFrom

Τοποθετήστε ένα κατηγόρημα ενσωματωμένο όταν ορίζει ποιος κόμβος ή ακμή μπορεί να συμμετέχει στο μοτίβο:

MATCH (person:Person WHERE person.firstName = 'Alice')
      -[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

Χρησιμοποιήστε ξανά μια μεταβλητή για να απαιτήσετε δύο θέσεις μοτίβου για τη σύνδεση του ίδιου στοιχείου. Διαχωρίστε τα μοτίβα με κόμματα για να συνθέσετε μεγαλύτερες δομές γραφημάτων. Χρησιμοποιήστε έναν ποσοδείκτη για {1,4} να επαναλάβετε ένα μοτίβο άκρων και να ταιριάξετε διαδρομές μεταβλητού μήκους.

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

Λειτουργία διαδρομής Συμπεριφορά
WALK Επιτρέπει επαναλαμβανόμενους κόμβους και άκρα. Αυτή η λειτουργία είναι η προεπιλεγμένη.
TRAIL Αποτρέπει τις επαναλαμβανόμενες ακμές.
SIMPLE Αποτρέπει την επανάληψη κόμβων εκτός από έναν κοινόχρηστο πρώτο και τελευταίο κόμβο.
ACYCLIC Αποτρέπει όλους τους επαναλαμβανόμενους κόμβους.

Ένα πρόθεμα αναζήτησης διαδρομής ελέγχει ποιες διαδρομές που ταιριάζουν. ALL είναι η προεπιλογή. ANY SHORTEST επιστρέφει μία συντομότερη διαδρομή για κάθε ζεύγος πηγής-προορισμού:

MATCH path = ANY SHORTEST
  (source:Person WHERE source.id = 123u)-[:knows]->{1,4}(target:Person)
RETURN target.id, path_length(path) AS hopCount

Τα ενσωματωμένα κατηγορήματα περιορίζουν την καταλληλότητα διαδρομής πριν από την επιλογή διαδρομής. Οι λειτουργίες σε επίπεδο MATCH ... WHERE δήλωσης και οι μεταγενέστερες FILTER λειτουργίες είναι μεταφίλτρα. Αυτή η διάκριση μπορεί να αλλάξει ANY SHORTEST τα αποτελέσματα.

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

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

Το 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 δήλωση. Με ένα πρόθεμα αναζήτησης διαδρομής, όπως ANY SHORTEST, το επίπεδο WHERE πρότασης εφαρμόζεται μετά την επιλογή διαδρομής. Αντίθετα, τα ενσωματωμένα κατηγορήματα περιορίζουν τις διαδρομές που είναι κατάλληλες για επιλογή. Για περισσότερες πληροφορίες, δείτε την ενότητα Τοποθέτηση κατηγορημάτων πριν ή μετά την επιλογή διαδρομής.

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

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

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

Σημαντικό

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

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

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

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

Σημαντικό

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

Συνδέστε μοτίβα με κοινόχρηστες μεταβλητές:

-- 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 πρόταση χρησιμοποιούν την ίδια εμβέλεια εισόδου, επομένως μια ανάθεση δεν μπορεί να αναφέρεται σε άλλη ανάθεση από αυτήν την πρόταση.

FOR δήλωση

Σύνταξη:

FOR <variable> IN <list_expression>
  [ WITH OFFSET <offset_variable> | WITH ORDINALITY <ordinality_variable> ]

Η FOR πρόταση επεκτείνει μια λίστα σε γραμμές. Για κάθε σειρά εισόδου, εκπέμπει μία σειρά εξόδου για κάθε στοιχείο λίστας και συνδέει αυτό το στοιχείο με την καθορισμένη μεταβλητή. Άλλες μεταβλητές από τη γραμμή εισαγωγής παραμένουν διαθέσιμες.

Χρησιμοποιείται για WITH OFFSET τη δέσμευση ενός δείκτη μηδενικής βάσης ή χρησιμοποιείται WITH ORDINALITY για τη δέσμευση μιας θέσης που βασίζεται σε ένα.

LET cities = ['Seattle', 'London', 'Tokyo']
FOR city IN cities WITH ORDINALITY position
RETURN city, position

Αυτό το ερώτημα επιστρέφει μία γραμμή για κάθε πόλη. Οι position τιμές είναι 1, 2, και 3. Εάν αντικαταστήσετε WITH ORDINALITY position με WITH OFFSET position, οι τιμές είναι 0, 1, και 2.

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

CALL δήλωση

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

CALL {
  <query statements>
  RETURN <columns>
}

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

Το ακόλουθο συσχετισμένο υποερώτημα υπολογίζει τον αριθμό των εργοδοτών για κάθε άτομο:

MATCH (p:Person)
CALL {
  MATCH (p)-[:workAt]->(company:Company)
  RETURN count(*) AS employerCount
}
RETURN p.firstName, p.lastName, employerCount
ORDER BY employerCount DESC

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

Το προηγούμενο count(*) παράδειγμα επιστρέφει πάντα μία γραμμή δευτερεύοντος ερωτήματος, επειδή χρησιμοποιεί μια μη ομαδοποιημένη συγκεντρωτική τιμή. Επομένως, ένα άτομο χωρίς αντίστοιχο εργοδότη έχει ένα employerCount .0

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

MATCH (p:Person)
OPTIONAL CALL {
  MATCH (p)-[:workAt]->(company:Company)
  RETURN company.name AS companyName
}
RETURN p.firstName, p.lastName, companyName

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

Σημαντικό

Τελειώστε κάθε ενσωματωμένο CALL σώμα με RETURN. Το Graph δεν υποστηρίζει επώνυμες κλήσεις διαδικασίας ή ρητές λίστες εισαγωγής μεταβλητών, όπως CALL (p) { ... }.

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 ] [ NULLS FIRST | NULLS LAST ],
         <expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ], ...

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

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 στην ταξινόμηση:

MATCH (p:Person)
RETURN p.firstName, p.birthday
ORDER BY p.birthday DESC NULLS LAST, p.firstName ASC

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

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

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

Προσοχή

Μόνο η ακόλουθη πρόταση αμέσως μετά μπορεί να δει τη σειρά ταξινόμησης που 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 ] [ NULLS FIRST | NULLS LAST ], ... ]
[ 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 companyId = c.id, companyName = c.name
RETURN companyId,
       companyName,
       count(*) AS employeeCount,
       avg(p.birthday) AS avg_birth_year
GROUP BY companyId, 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 περιλαμβάνουν τιμές Boolean, συμβολοσειρά, αριθμητική, χρονική, λίστα, κόμβο, άκρη, διαδρομή, null και τίποτα. Οι τύποι μπορούν να μηδενιστούν, εκτός αν καθορίσετε NOT NULL. Οι ιδιότητες χρησιμοποιούν ένα υποστηριζόμενο υποσύνολο του πλήρους συστήματος τιμών ερωτήματος.

RETURN 42 AS integerValue,
       'Alice' AS stringValue,
       TRUE AS booleanValue,
       [1, 2, 3] AS listValue

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

Σημείωμα

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

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

Εκφράσεις

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

MATCH (person:Person)
FILTER person.birthday < 19900101
RETURN person.firstName,
       CASE person.gender
         WHEN 'female' THEN 'F'
         WHEN 'male' THEN 'M'
         ELSE 'Other'
       END AS genderCode

Η GQL χρησιμοποιεί λογική τριών τιμών: Οι δυαδικές εκφράσεις μπορούν να αποτιμηθούν σε TRUE, FALSE, ή UNKNOWN. Το A FILTER διατηρεί μόνο τις γραμμές για τις οποίες το κατηγόρημά του είναι TRUE.

Συνάθροιση συναρτήσεων όπως COUNT, SUM, AVG, MINκαι MAX σύνοψη γραμμών. Καταγράψτε κατηγορήματα όπως ALL, ANY, NONEκαι SINGLE αξιολογήστε ένα κατηγόρημα για στοιχεία λίστας. Τα δευτερεύοντα ερωτήματα φόρμας EXISTS διαδικασίας ελέγχουν εάν ένα ένθετο ερώτημα επιστρέφει μια γραμμή.

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

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

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

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

Σημαντικό

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

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

UNION και UNION ALL

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

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

Το Bare UNION ισοδυναμεί με UNION DISTINCT; και τα δύο αφαιρούν διπλές σειρές. UNION ALL Διατηρεί όλες τις γραμμές, συμπεριλαμβανομένων των διπλότυπων.

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

NEXT

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

<query stage>
RETURN <columns>
NEXT
<query stage>

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

MATCH (person:Person)-[:workAt]->(company:Company)
RETURN person, company.name AS companyName
NEXT
MATCH (person)-[:isLocatedIn]->(city:City)
RETURN person.firstName AS employee, companyName, city.name AS city

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

Οποιοδήποτε στάδιο μπορεί να περιέχει μια ένωση μπλοκ ερωτημάτων. Μια ένωση αξιολογείται εντός του σταδίου της πριν η έξοδος του σταδίου υπερβεί το NEXT όριο. Εάν A, B, και C αντιπροσωπεύουν μπλοκ ερωτημάτων, A UNION B NEXT C ομαδοποιούνται ως , ενώ A NEXT B UNION C ομαδοποιούνται ως (A UNION B) NEXT CA NEXT (B UNION C).

Προτάσεις υπό όρους

Χρησιμοποιήστε μια πρόταση υπό συνθήκη για να δρομολογήσετε κάθε εισερχόμενη γραμμή στον πρώτο κλάδο του οποίου το κατηγόρημα αποτιμάται σε TRUE:

WHEN <predicate> THEN <linear query statement or { query statements }>
[ WHEN <predicate> THEN <linear query statement or { query statements }> ... ]
[ ELSE <linear query statement or { query statements }> ]

Για να δρομολογήσετε γραμμές από ένα προηγούμενο στάδιο ερωτήματος, επιστρέψτε τις απαιτούμενες στήλες και χρησιμοποιήστε NEXT πριν από την πρόταση υπό όρους:

MATCH (p:Person)
RETURN p.firstName AS name, p.birthday AS birthday
NEXT
WHEN birthday < 19800101u THEN
  RETURN name, 'Before 1980' AS era
WHEN birthday < 20000101u THEN
  RETURN name, '1980-1999' AS era
ELSE
  RETURN name, '2000 or later' AS era

Κάθε WHEN κατηγόρημα πρέπει να είναι Boolean. Ο μηχανισμός ερωτημάτων αξιολογεί τα κατηγορήματα με τη σειρά για κάθε γραμμή εισόδου. Ένα κατηγόρημα που αποτιμά ή UNKNOWN δεν επιλέγει τον FALSE κλάδο του. Αφού ένα κατηγόρημα αξιολογηθεί σε TRUE, τα μεταγενέστερα κατηγορήματα και τα μη επιλεγμένα σώματα διακλάδωσης δεν αξιολογούνται. Εάν δεν αποτιμάται κατηγόρημα σε TRUE και δεν ELSEυπάρχει , η γραμμή εισόδου δεν επιστρέφεται.

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

MATCH (p:Person)
RETURN p, p.firstName AS name
NEXT
WHEN p.gender = 'female' THEN {
  CALL {
    MATCH (p)-[:knows]->(friend:Person)
    RETURN count(*) AS friendCount
  }
  RETURN name, friendCount
}
ELSE
  RETURN name, 0u AS friendCount

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

Οι προτάσεις υπό συνθήκη διαφέρουν από CASE τις εκφράσεις. Το Graph υποστηρίζει απλές CASE <expression> WHEN <value>, αλλά όχι αναζητημένες CASE WHEN <predicate> εκφράσεις. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Εκφράσεις υπό συνθήκη.

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

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

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

-- 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 fullName
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 a new variable for the friend
RETURN p.firstName AS manager, e.firstName AS friend, gender

Προσοχή

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

Συνάθροιση γραμμών και στοιχείων διαδρομής

Η GQL υποστηρίζει δύο περιβάλλοντα συνάθροισης:

  • Η κατακόρυφη συνάθροιση συνοψίζει τις γραμμές εισόδου, προαιρετικά διαμερισμένες κατά GROUP BY μεταβλητές.
  • Η οριζόντια συνάθροιση συνοψίζει μια λίστα ομάδων που δεσμεύεται από ένα μοτίβο άκρων μεταβλητού μήκους μέσα σε μια αντιστοιχισμένη διαδρομή.
MATCH (person:Person)-[:workAt]->(company:Company)
LET companyId = company.id, companyName = company.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
MATCH (:Person)-[connections:knows]->{1,4}(:Person)
RETURN count(connections) AS pathLength

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

Χειρισμός μηδενικών τιμών και σφαλμάτων ερωτήματος

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

MATCH (person:Person)
FILTER person.browserUsed IS NULL
RETURN person.firstName

Μια σύγκριση με το null αποτιμάται σε UNKNOWN, το οποίο το a FILTER δεν διατηρεί. Χρησιμοποιήστε το coalesce() όταν χρειάζεστε μια εναλλακτική τιμή.

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

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

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

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

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

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

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