Modelli di grafo GQL

I modelli di grafo sono blocchi predefiniti principali delle query GQL nel grafico in Microsoft Fabric. 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.

Questo articolo illustra la sintassi e le regole di composizione per i modelli di grafo in GQL.

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:

(:Place&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 combinazione di etichette e 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 nodi possono avere più etichette, ma i tipi di arco con più etichette non sono ancora supportati.

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 pattern di nodo di origine a un pattern di nodo target. 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) sia il pattern del nodo di origine che (:Comment) quello del 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 pattern corrisponde agli stessi archi di (:Song)-[:inspired]->(:Movie) e (:Movie)-[:inspired]->(:Song) combinati, indipendentemente da quale nodo sia l'origine e quale sia il target (questo esempio non proviene 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.birthday < 19900101 AND p.gender = 'female')
      -[:workAt]->
      (c:Company WHERE c.name STARTS WITH 'A')

-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL

-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL

Suggerimento

Tieni un predicato all'interno del pattern quando descrive quale nodo o arco può partecipare alla partita.

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.

I pattern nello stesso MATCH non devono necessariamente condividere una variabile. I pattern disconnessi formano un prodotto cartesiano delle loro corrispondenze. Riutilizzare una variabile quando i pattern dovrebbero collegare lo stesso elemento del grafo e dovrebbero rimanere solo le combinazioni unite.

Riutilizzo degli elementi di controllo

GQL controlla nodi e spigoli ripetuti a due livelli:

  • Una modalità corrispondenza si applica al modello completo del grafo, inclusi i percorsi separati da virgole.
  • Una modalità percorso si applica a un percorso.

La modalità di partita predefinita è REPEATABLE ELEMENTS. Permette che lo stesso binding di elementi avvenga in diverse parti del pattern grafico, soggetto alla modalità path di ciascun percorso. Puoi scriverlo esplicitamente:

REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Usa DIFFERENT EDGES o il sinonimo DIFFERENT RELATIONSHIPS è per richiedere un'unicità di spigolo su tutto il pattern del grafo. Questa modalità match modifica anche qualsiasi WALK percorso nel pattern in TRAIL comportamento.

DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Le seguenti modalità di percorso controllano gli elementi ripetuti all'interno di ciascun percorso:

Modalità di percorso Riutilizzo degli elementi
WALK Nodi e archi possono ripetersi.
TRAIL Gli archi non possono ripetersi, ma i nodi possono ripetersi.
SIMPLE I nodi non possono ripetersi, tranne che il primo e l'ultimo nodo possono essere gli stessi. I bordi non possono ripetersi.
ACYCLIC I nodi non possono ripetersi, compreso il primo e l'ultimo nodo. I bordi non possono ripetersi.

WALK è la modalità di percorso predefinita. Prefissa un percorso con un'altra modalità quando hai bisogno di un'unicità elementare più rigida:

Per SIMPLE e ACYCLIC, l'unicità degli archi deriva dall'unicità dei nodi. Un SIMPLE percorso può chiudersi tornando al suo primo nodo, ma non può comunque riutilizzare un bordo.

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

Il TRAIL modello produce solo corrispondenze in cui e1, e2, e e3 sono diversi. I nodi possono comunque ripetersi, quindi il percorso può formare un ciclo senza riutilizzare un bordo.

Controlla quali percorsi vengono restituiti

Un prefisso di ricerca di percorso controlla quali percorsi restituisce un pattern di percorso. Il prefisso predefinito ALL restituisce ogni percorso che corrisponde alla modalità e al pattern del percorso. Puoi scrivere ALL esplicitamente:

ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)

Usare ANY SHORTEST per restituire un percorso corrispondente più breve per ogni coppia sorgente-destinazione da ogni riga di input:

MATCH p = ANY SHORTEST
  (src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100

Se più percorsi coincidono per la lunghezza più breve, la query restituisce uno di essi, ma quale percorso legato viene restituito non è deterministico. Un limite inferiore di zero può restituire un percorso a zero salto da un nodo sorgente a se stesso.

ALL SHORTEST e ANY le ricerche di percorso non sono supportate.

Posizionare i predicati prima o dopo la selezione del percorso

La posizione dei predicati determina se una condizione definisce i percorsi idonei o filtra i percorsi dopo che il prefisso di ricerca del percorso li ha selezionati:

  • Un inline WHERE in un nodo o un pattern di spigoli fa parte del pattern. Limita quali percorsi sono idonei prima ALL o ANY SHORTEST vengono applicati.
  • Un livello WHERE di istruzione dopo il pattern completo MATCH è un filtro post. Filtra le righe dopo che il prefisso di ricerca del percorso ha selezionato i percorsi.
  • Un'istruzione successiva FILTER filtra anche le righe dopo la selezione del percorso.

Questa distinzione è particolarmente importante con ANY SHORTEST. Nel seguente schema, solo knows gli archi creati a data specificata o dopo sono idonei quando la query seleziona il percorso più breve:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connection:knows
    WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
RETURN p

Spostare la condizione del bordo su un postfiltro cambia il significato. La query seleziona prima il percorso più breve senza quella condizione. Poi rimuove il percorso selezionato se un arco non soddisfa la condizione; non seleziona invece un percorso più lungo:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connections:knows]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
           WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p

Importante

Per alcune ANY SHORTEST forme di query, Graph può attualmente applicare una condizione a livello MATCH ... WHERE di istruzione prima della selezione del percorso. Fino a quando questa limitazione non sarà risolta, si usano predicati inline per l'idoneità al percorso e un'istruzione separata FILTER per il filtraggio post-selezione. Per altre informazioni, vedere le limitazioni correnti.

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

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 zero. Una corrispondenza zero-hop non contiene archi e richiede che entrambi i pattern di nodo finale corrispondano allo stesso nodo.

Esempio:

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

Questo schema corrisponde a ogni persona sia p1 come a p2 zero salti sia a zero, sia a coppie connesse in un solo salto.

Quando non è specificato alcun limite inferiore in {,n}, il limite predefinito diventa 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 persone che si conoscono hanno messo like a commenti diversi e un messaggio m è collegato a ciascun commento da una catena di uno a tre replyOf bordi.

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

Per maggiori informazioni, vedi Funzioni aggregate.

Modelli a lunghezza variabile non associati

Usa un quantificatore illimitato quando la lunghezza massima del percorso non è nota:

-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)

Le * scorciatoie e + specificano zero o più e una o più ripetizioni:

-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)

-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)

Un pattern illimitato con la combinazione predefinita ALL WALK viene rifiutato perché i cicli possono produrre infiniti percorsi corrispondenti. Usa TRAIL, SIMPLE, oppure ACYCLIC per limitare il percorso attraverso l'unicità di spigoli o nodi. Questi modi garantiscono la terminazione, ma un grafo grande può comunque produrre un gran numero di percorsi.

Importante

Per un percorso delimitato da un non limitato ANY SHORTEST WALK, gli unici usi supportati sono PATH_LENGTH(path) e, insieme ad esso, path IS NULL. Il grafico non materializza il percorso completo in questa forma. Usare un limite superiore finito o specificare TRAIL, SIMPLE, oppure ACYCLIC per restituire o comunque usare il percorso.