Φιλτράρισμα και συγκέντρωση δεδομένων γραφήματος στο Microsoft Fabric

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

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

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

Prerequisites

Φιλτράρισμα σειρών με FILTER

Χρησιμοποιήστε το FILTER για να διατηρήσετε μόνο τις γραμμές που ικανοποιούν μια συνθήκη. Τοποθετήστε FILTER μετά MATCH για να περιορίσετε τα αποτελέσματα που ταιριάζουν.

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

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

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

MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName

Συμβουλή

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

Φιλτράρισμα κατά την αντιστοίχιση μοτίβων

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

Για παράδειγμα, για να βρείτε άτομα που γεννήθηκαν πριν από το 1994 μαζί με την εταιρεία στην οποία εργάζονται, περιορίζοντας τα αποτελέσματα σε εταιρείες των οποίων το όνομα αρχίζει με «Α»:

MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

Φιλτράρετε τις ιδιότητες των άκρων με τον ίδιο τρόπο. Για παράδειγμα, για να επιστρέψετε μόνο άτομα που άρχισαν να εργάζονται σε μια εταιρεία το 2000 ή αργότερα:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom

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

Χειρισμός τιμών null σε φίλτρα

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

Χρησιμοποιήστε IS NULL και IS NOT NULL για να ελέγξετε ρητά για μηδενικές τιμές:

-- Only include people whose browser is known
MATCH (p:Person)
FILTER p.browserUsed IS NOT NULL
RETURN p.firstName, p.browserUsed

Χρησιμοποιήστε το coalesce() για να αντικαταστήσετε μια προεπιλεγμένη τιμή όταν μια ιδιότητα μπορεί να είναι null:

MATCH (p:Person)
RETURN p.firstName, coalesce(p.browserUsed, 'Unknown browser') AS browser

Προσοχή

NULL = NULL αξιολογεί σε UNKNOWN, όχι TRUE. Χρησιμοποιείται IS NULL πάντα για τον έλεγχο μηδενικών τιμών, όχι ισότητας.

Συγκεντρωτικά αποτελέσματα με RETURN

Χρησιμοποιήστε συναρτήσεις συγκεντρωτικών αποτελεσμάτων στο RETURN για να συνοψίσετε τα αποτελέσματά σας. Το Graph υποστηρίζει τις ακόλουθες συγκεντρωτικές συναρτήσεις: COUNT, SUM, AVG, MIN, MAX, COLLECT_LIST, και COLLECT_ELEMENTSCOLLECT_ONE.

Για παράδειγμα, για να μετρήσετε όλα τα άτομα στο γράφημα:

MATCH (p:Person)
RETURN count(*) AS totalPeople

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

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

Φιλτράρισμα εισόδου για ένα σύνολο

Προσθέστε FILTER (WHERE predicate) μετά από μια συγκεντρωτική τιμή για να φιλτράρετε μόνο την είσοδο αυτής της συγκεντρωτικής τιμής. Άλλα συγκεντρωτικά στοιχεία στο ίδιο RETURN εξακολουθούν να λαμβάνουν όλες τις γραμμές εισόδου.

MATCH (p:Person)
RETURN count(*) AS allPeople,
       count(*) FILTER (WHERE p.birthday < 19900101) AS peopleBornBefore1990

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

MATCH (p:Person)
RETURN count(*) FILTER (WHERE p.birthday < 19900101 LIMIT 100) AS sampleCount

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

Συλλέξτε τιμές

Χρησιμοποιήστε το COLLECT_LIST για να επιστρέψετε ένα στοιχείο λίστας για κάθε τιμή εισόδου, συμπεριλαμβανομένων των μηδενικών τιμών. Προσθήκη DISTINCT για κατάργηση διπλότυπων.

MATCH (p:Person)
RETURN collect_list(DISTINCT p.browserUsed) AS browsers

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

COLLECT_ELEMENTS δέχεται εισόδους με τιμή λίστας και συνενώνει τα στοιχεία τους σε μία λίστα:

MATCH (p:Person)
RETURN collect_elements([p.firstName, p.lastName]) AS names

Χωρίς ομαδοποίηση στηλών, ένα ερώτημα συγκεντρωτικών αποτελεσμάτων χωρίς γραμμές εισόδου επιστρέφει μια κενή λίστα από COLLECT_LIST και COLLECT_ELEMENTS και null από COLLECT_ONE.

Ομαδικά αποτελέσματα με GROUP BY

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

Για παράδειγμα, για να μετρήσετε τους υπαλλήλους ανά εταιρεία:

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

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

MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
       browser,
       count(*) AS personCount,
       min(p.birthday) AS earliestBirthday,
       max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10

Σημείωμα

Όλες οι μη συγκεντρωτικές εκφράσεις στο RETURN πρέπει να εμφανίζονται στο GROUP BY. Οι παραστάσεις που δεν περιλαμβάνονται πρέπει GROUP BY να χρησιμοποιούν μια συνάρτηση συγκεντρωτικών αποτελεσμάτων.

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

Χρησιμοποιήστε και ORDER BYLIMIT μαζί με GROUP BY για να βρείτε κορυφαία αποτελέσματα.

Για παράδειγμα, για να βρείτε τις πέντε κορυφαίες πόλεις ανά αριθμό κατοίκων:

MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityId = city.id, cityName = city.name
RETURN cityId, cityName, count(*) AS residentCount
GROUP BY cityId, cityName
ORDER BY residentCount DESC
LIMIT 5

Σημαντικό

Τοποθετήστε ORDER BY πριν .LIMIT LIMIT ισχύει πάντα για το ήδη ταξινομημένο σύνολο αποτελεσμάτων.

Δρομολόγηση γραμμών με προτάσεις υπό συνθήκη

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

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
NEXT
WHEN employeeCount >= 100u THEN
  RETURN companyId, companyName, employeeCount, 'Large' AS category
WHEN employeeCount >= 10u THEN
  RETURN companyId, companyName, employeeCount, 'Medium' AS category
ELSE
  RETURN companyId, companyName, employeeCount, 'Small' AS category

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

FOR selector IN [1, 2, 3]
RETURN selector
NEXT
WHEN selector = 1 THEN
  MATCH (:Person)-[:knows]->(:Person)
  RETURN count(*) AS total, 'Knows edges' AS category
WHEN selector = 2 THEN {
  MATCH (:Person)-[:workAt]->(:Company)
  RETURN count(*) AS partialCount
  UNION ALL
  MATCH (:Person)-[:studyAt]->(:University)
  RETURN count(*) AS partialCount
  NEXT
  RETURN sum(partialCount) AS total, 'Affiliation edges' AS category
}
ELSE
  RETURN 0u AS total, 'No selected metric' AS category

Ο μηχανισμός ερωτημάτων αξιολογεί τα κατηγορήματα με τη σειρά για κάθε γραμμή. Εκτελεί μόνο τον πρώτο κλάδο που ταιριάζει. Εάν ένα κατηγόρημα αποτιμάται σε UNKNOWN, η αξιολόγηση συνεχίζεται με τον επόμενο κλάδο. Χωρίς , ELSEοι γραμμές που δεν ταιριάζουν με έναν WHEN κλάδο παραλείπονται.

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