Condividi tramite


Modelli di grafo GQL

Annotazioni

Questa funzionalità è attualmente disponibile in anteprima pubblica. Questa anteprima viene messa a disposizione senza contratto di servizio e non è consigliata per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

I modelli di grafo sono blocchi predefiniti principali delle query GQL. Descrivono le strutture che si stanno cercando nel grafico usando nodi e archi in modo intuitivo e visivo. Si considerino modelli di grafo come modelli che il motore di query tenta di confrontare con i dati effettivi nel grafico.

Importante

Questo articolo utilizza esclusivamente il dataset di esempio dei grafi dei social network.

Modelli di elementi semplici

I modelli di elementi semplici consentono di trovare corrispondenze tra singoli nodi e archi dal grafico che soddisfano requisiti specifici. Questi modelli costituiscono la base per criteri di ricerca più complessi.

Modelli di nodo semplici

Un criterio di nodo specifica le etichette e le proprietà che un nodo deve corrispondere:

(:City { name: "New York" })

Questo modello corrisponde a tutti i nodi con etichettePlace e City (indicate dall'operatore & ) e la cui name proprietà è uguale a "New York". Questa specifica delle etichette e delle proprietà obbligatorie è denominata riempitivo del modello di nodo.

Concetti chiave:

  • Corrispondenza delle etichette: usare & per richiedere più etichette.
  • Filtro delle proprietà: specificare valori esatti che le proprietà devono corrispondere.
  • Corrispondenza flessibile ("covariante") : i nodi corrispondenti possono avere più etichette e proprietà oltre quelli specificati.

Annotazioni

I modelli di grafi con etichette multiple di elementi non sono ancora supportati (problema noto).

Modelli di arco semplici

I modelli di arco sono più complessi rispetto ai modelli di nodo. Non solo specificano un filler, ma collegano anche un modello di nodo di origine a un modello di nodo di destinazione. I modelli edge descrivono i requisiti sia sul perimetro che sui relativi endpoint:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

La direzione -[...]-> della freccia è importante: determina (:Person) come modello di nodo di origine e (:Comment) come modello di nodo di destinazione. Comprendere la direzione dei bordi è fondamentale per eseguire correttamente query sul grafico.

Modello con mirroring equivalente:

È possibile capovolgere la freccia e scambiare i modelli di nodo per creare il modello di bordo con mirroring equivalente:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Questo modello trova le stesse relazioni, ma dal punto di vista opposto.

Modelli di arco qualsiasi diretto

Quando la direzione di un bordo del grafo non è rilevante per la query, è possibile lasciarla non specificata creando un modello di arco diretto qualsiasi:

(:Song)-[:inspired]-(:Movie)

Questo modello corrisponde agli stessi bordi di (:Song)-[:inspired]->(:Movie) e (:Movie)-[:inspired]->(:Song) combinati, indipendentemente dal nodo di origine e che è la destinazione (questo esempio non è dal tipo di grafo del social network).

Tasti di scelta rapida per i criteri di spostamento dei bordi del grafico

GQL offre collegamenti pratici per i modelli di arco comuni per rendere le query più concise:

  • ()->() sta per ()-[]->() (bordo diretto con qualsiasi etichetta)
  • ()<-() sta per ()<-[]-() (bordo diretto inverso con qualsiasi etichetta)
  • ()-() sta per ()-[]-() (bordo qualsiasi diretto con qualsiasi etichetta)

Questi collegamenti possono essere utili quando ci si preoccupa della connettività, ma non del tipo di bordo del grafico specifico.

Espressioni di etichetta

I modelli possono esprimere requisiti complessi sulle etichette di nodi e archi corrispondenti.

Esempio:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

In questo modo viene conteggiato il numero di isLocatedIn archi che connettono Person nodi o Organizationnodi ,ma non,Company che sono sempre University nodi nello schema di social network, a City o Country nodi.

Sintassi:

Sintassi Meaning
A&B Le etichette devono includere sia A che B.
A|B Le etichette devono includere almeno uno di A o B.
!A Le etichette devono escludere A.

Usare inoltre le parentesi per controllare l'ordine di valutazione dell'espressione di etichetta. Per impostazione predefinita, ! ha la precedenza più alta e & ha una precedenza maggiore rispetto a |. Pertanto !A&B|C|!D è uguale ((!A)&B)|C|(!D)a .

Variabili di associazione

Le variabili consentono di fare riferimento agli elementi del grafo corrispondenti in altre parti della query. Comprendere come associare e usare le variabili è essenziale per la creazione di query avanzate.

Variabili dell'elemento di associazione

Sia i modelli di nodo che di arco possono associare nodi e archi corrispondenti alle variabili per riferimento successivo.

(p:Person)-[w:workAt]->(c:Company)

In questo modello, p è associato ai nodi corrispondenti, Person ai bordi corrispondenti wworkAt e c ai nodi corrispondentiCompany.

Riutilizzo delle variabili per i vincoli strutturali:

Il riutilizzo della stessa variabile in un criterio più volte esprime una restrizione sulla struttura delle corrispondenze. Ogni occorrenza della stessa variabile deve sempre essere associata allo stesso elemento del grafico in una corrispondenza valida. Il riutilizzo delle variabili è potente per esprimere requisiti strutturali complessi.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Il modello trova Person i nodi x e y che si conoscono tra loro e funzionano allo stesso Companyoggetto , associato alla variabile c. Il riutilizzo di c garantisce che entrambe le persone lavorino nella stessa azienda.

Predicati del criterio con variabili di elemento:

Le variabili degli elementi di associazione consentono di specificare predicati del modello di nodo e di arco. Invece di fornire solo un filler con valori di proprietà esatti come { name: "New York, USA" }, un filler può specificare un predicato che viene valutato per ogni elemento candidato. Il criterio corrisponde solo se il predicato restituisce TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Il modello di arco trova persone che si conoscevano a partire dal 1° gennaio 2000, usando una condizione flessibile anziché una corrispondenza esatta.

Annotazioni

Le variabili del modello di arco si associano sempre al singolo bordo nel predicato del modello di arco, anche quando si usano modelli a lunghezza variabile. Ciò può aiutare a non dover rimuovere le variabili dell'elenco di gruppi perimetrali per eseguire un post-filtro. Vedere Associare variabili di arco del modello a lunghezza variabile.

Tecniche avanzate di predicato del modello:

I predicati dei criteri offrono potenti funzionalità di filtro inline che possono migliorare la leggibilità delle query:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
      -[:workAt]->
      (c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')

-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z') 
                              AND w.salary > 75000]-(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE

-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target

Suggerimento

L'uso dei predicati dei criteri quando le condizioni sono altamente selettive può ridurre le dimensioni dei risultati intermedi.

Variabili del percorso di associazione

È anche possibile associare un percorso corrispondente a una variabile di percorso per un'ulteriore elaborazione o per restituire la struttura del percorso completa all'utente:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

In questo caso, p è associato a un valore di percorso che rappresenta la struttura del percorso corrispondente completa, inclusi i valori di riferimento per tutti i nodi e i bordi nell'ordine specificato.

I percorsi legati possono essere restituiti all'utente o ulteriormente elaborati utilizzando funzioni come NODES o EDGES:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Comporre modelli

Le query reali richiedono spesso modelli più complessi rispetto alle semplici strutture node-edge-node. GQL offre diversi modi per comporre modelli per gli attraversamenti di gragrafi sofisticati.

Comporre modelli di percorso

I modelli di percorso possono essere composti concatenando modelli di nodi e archi semplici per creare attraversamenti più lunghi.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Il modello attraversa da una persona attraverso le loro connessioni sociali e professionali per trovare dove si trova la società del collega.

Costruzione di modelli a fasi: È anche possibile creare modelli di percorso in modo più incrementale, in modo da semplificare la lettura e la comprensione di modelli complessi:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Questo approccio suddivide lo stesso attraversamento in passaggi logici, semplificando la comprensione e il debug.

Comporre modelli non lineari

La forma risultante di un motivo non deve essere un percorso lineare. È possibile trovare una corrispondenza con strutture più complesse, ad esempio modelli a forma di stella che si irradiano da un nodo centrale:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Il modello trova una persona insieme alle preferenze di formazione, occupazione e contenuto contemporaneamente, ovvero una query di profilo completa.

Percorsi di corrispondenza

In modelli complessi, spesso è indesiderato attraversare lo stesso bordo più volte. Il riutilizzo dei bordi diventa importante quando il grafico effettivo contiene cicli che potrebbero portare a percorsi infiniti o eccessivamente lunghi. Per gestire il riutilizzo dei bordi, graph in Microsoft Fabric supporta la TRAIL modalità di corrispondenza.

Il prefisso di un modello di percorso con la parola chiave TRAIL elimina tutte le corrispondenze che associano più volte lo stesso bordo:

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

TRAILUtilizzando , il criterio produce solo corrispondenze in cui tutti i bordi sono diversi. Pertanto, anche se c = a il percorso forma un ciclo in una determinata corrispondenza, e3 non viene mai associato allo stesso bordo di e1.

La TRAIL modalità è essenziale per impedire cicli infiniti e garantire che le query restituiscano percorsi significativi e nonundant.

Usare modelli a lunghezza variabile

I modelli a lunghezza variabile sono costrutti potenti che consentono di trovare percorsi di lunghezza variabile senza scrivere specifiche di pattern ripetitive. Sono essenziali per attraversare gerarchie, social network e altre strutture in cui la lunghezza ottimale del percorso non è nota in anticipo.

Modelli a lunghezza variabile delimitata

Importante

I modelli a lunghezza variabile delimitata supportano attualmente solo un limite massimo superiore pari a 8. Vedere l'articolo sulle limitazioni correnti.

Molte query di gragrafi comuni richiedono più volte la ripetizione dello stesso modello di arco. Invece di scrivere modelli verbosi come:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

È possibile usare la sintassi a lunghezza variabile più concisa:

(:Person)-[:knows]->{3}(:Person)

{3} Specifica che il -[:knows]-> modello di arco deve essere ripetuto esattamente tre volte.

Intervalli di ripetizioni flessibili: Per una maggiore flessibilità, è possibile specificare sia un limite inferiore che un limite superiore per la ripetizione:

(:Person)-[:knows]->{1, 3}(:Person)

Questo modello trova amici diretti, amici-amici e amici-di-amici-di-amici tutti in una singola query.

Annotazioni

Il limite inferiore può anche essere 0. In questo caso, nessun bordo viene confrontato e l'intero modello corrisponde solo se e solo se i due modelli di nodo endpoint corrispondono allo stesso nodo.

Esempio:

(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)

Questo schema corrisponde a coppie di persone diverse che si conoscono tra loro ma anche alla stessa persona come entrambi p1 e p2 - anche se quella persona non "conosce" se stessa.

Quando non viene specificato alcun limite inferiore, il valore predefinito è 0 (zero).

Composizioni complesse a lunghezza variabile: I modelli a lunghezza variabile possono far parte di modelli più grandi e complessi, come nella seguente inquisizione:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

Il modello trova coppie di commenti in cui le persone che si conoscono tra loro hanno apprezzato commenti diversi e tali commenti sono collegati tramite catene di risposte di 1-5 livelli ciascuno.

Associare variabili di arco del modello a lunghezza variabile

Quando si associa un modello di arco a lunghezza variabile, il valore e il tipo della variabile di arco cambiano a seconda del contesto di riferimento. Comprendere questo comportamento è fondamentale per l'elaborazione corretta delle corrispondenze a lunghezza variabile:

Due gradi di riferimento:

  • All'interno di un modello a lunghezza variabile: le variabili del bordo del grafo si associano a ogni singolo bordo lungo il percorso corrispondente (detto anche "grado singleton di riferimento")
  • All'esterno di un modello a lunghezza variabile: le variabili dei bordi del grafico si associano alla sequenza di tutti i bordi lungo il percorso corrispondente (detto anche "grado di gruppo di riferimento")

Esempio che illustra entrambi i contesti:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

La valutazione della variabile e di arco viene eseguita in due contesti:

  • Nella dichiarazione: La MATCHquery trova catene di amici-amici-di-amici-di-amici in cui ogni amicizia è stata stabilita dall'anno 2000. Durante la corrispondenza dei criteri, il predicato e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") del modello di arco viene valutato una volta per ogni arco candidato. In questo contesto, e è associato a un singolo valore di riferimento perimetrale.

  • Nell'istruzioneRETURN: in questo caso, e è associato a un elenco (gruppo) di valori di riferimento ai bordi nell'ordine in cui si verificano nella catena corrispondente. Il risultato di e[0] è il primo valore di riferimento del bordo in ogni catena corrispondente.

Variabili di spigolo a lunghezza variabile in aggregazione orizzontale:

Le variabili di spigolo legate da un pattern matching di lunghezza variabile sono liste di gruppi al di fuori del pattern a lunghezza variabile e quindi possono essere utilizzate in aggregazione orizzontale.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

Vedi la sezione sull'aggregazione orizzontale per ulteriori dettagli.