mirror of
https://github.com/Steffo99/unimore-bda-5.git
synced 2024-11-21 23:54:24 +00:00
Scrivi Realizzazione della Graph Projection
This commit is contained in:
parent
135b2fcf1d
commit
345eb65f37
2 changed files with 115 additions and 2 deletions
106
README.md
106
README.md
|
@ -89,9 +89,108 @@ Per effettuare il clone del DBMS, è stato sufficiente aprire il menu <kbd>··
|
|||
|
||||
Per installare la [Graph Data Science Library], si è cliccato sul nome del database clonato, si ha selezionato la scheda <kbd>Plugins</kbd>, aperto la sezione <kbd>Graph Data Science Library</kbd>, e infine premuto su <kbd>Install</kbd>.
|
||||
|
||||
## Realizzazione
|
||||
## Concetti
|
||||
|
||||
### Graph Catalog
|
||||
|
||||
La [Graph Data Science Library] non è in grado di operare direttamente sul grafo, ma opera su delle proiezioni di parti di esso immagazzinate effimeramente all'interno di uno storage denominato [Graph Catalog], al fine di permettere agli algoritmi di operare con maggiore efficienza su un sottoinsieme mirato di elementi del grafo.
|
||||
|
||||
Esistono vari modi per creare nuove proiezioni, ma all'interno di questa relazione ci si concentra su due di essi, ovvero le funzioni Cypher:
|
||||
- [`gds.graph.project.cypher`] (anche detta Cypher projection), che crea una proiezione a partire da due query Cypher, suggerita per il solo utilizzo in fase di sviluppo in quanto relativamente lenta
|
||||
- [`gds.graph.project`] (anche detta native projection), che crea una proiezione a partire dai label di nodi ed archi, operando direttamente sui dati grezzi del DBMS, ottenendo così un'efficienza significativamente maggiore e offrendo alcune funzionalità aggiuntive
|
||||
|
||||
Il Graph Catalog viene svuotato ad ogni nuovo avvio del DBMS Neo4J; si richiede pertanto di fare attenzione a non interrompere il processo del DBMS tra la creazione di una proiezione e l'esecuzione di un algoritmo su di essa.
|
||||
|
||||
## Analisi
|
||||
|
||||
### 1️⃣ Realizzazione della *Graph Projection*
|
||||
|
||||
Si utilizza un approccio bottom-up per la costruzione della graph projection delle crate e delle loro dipendenze.
|
||||
|
||||
#### Determinazione dei nodi partecipanti
|
||||
|
||||
Si usa la seguente query triviale per determinare i codici identificativi dei nodi che partecipano all'algoritmo:
|
||||
|
||||
```cypher
|
||||
MATCH (a:Crate)
|
||||
RETURN id(a) AS id
|
||||
```
|
||||
|
||||
```text
|
||||
╒═══╕
|
||||
│id │
|
||||
╞═══╡
|
||||
│0 │
|
||||
├───┤
|
||||
│1 │
|
||||
├───┤
|
||||
│2 │
|
||||
├───┤
|
||||
```
|
||||
|
||||
#### Determinazione degli archi partecipanti
|
||||
|
||||
Si costruisce invece una query più avanzata per interconnettere all'interno della proiezione i nodi in base alle dipendenze della loro versione più recente:
|
||||
|
||||
```cypher
|
||||
// Trova tutte le versioni delle crate
|
||||
MATCH (a:Crate)-[:HAS_VERSION]->(v:Version)
|
||||
// Metti in ordine le versioni utilizzando l'ordine lessicografico inverso, che corrisponde all'ordine del versionamento semantico (semver) dalla versione più recente alla più vecchia
|
||||
WITH a, v ORDER BY v.name DESC
|
||||
// Per ogni crate, crea una lista ordinata contenente tutti i nomi delle relative versioni, ed estraine il primo, ottenendo così il nome della versione più recente
|
||||
WITH a, collect(v.name)[0] AS vn
|
||||
// Utilizzando il nome trovato, determina il nodo :Version corrispondente ad essa, e le crate che la contengono
|
||||
MATCH (a:Crate)-[:HAS_VERSION]->(v:Version {name: vn})-[:DEPENDS_ON]->(c:Crate)
|
||||
// Restituisci gli id dei nodi sorgente e destinazione
|
||||
RETURN id(a) AS source, id(c) AS target
|
||||
```
|
||||
|
||||
```text
|
||||
╒══════╤══════╕
|
||||
│source│target│
|
||||
╞══════╪══════╡
|
||||
│98825 │21067 │
|
||||
├──────┼──────┤
|
||||
│98825 │16957 │
|
||||
├──────┼──────┤
|
||||
│22273 │21318 │
|
||||
├──────┼──────┤
|
||||
```
|
||||
|
||||
#### Creazione della graph projection
|
||||
|
||||
Si combinano le due precedenti query in una chiamata a [`gds.graph.project.cypher`]:
|
||||
|
||||
```cypher
|
||||
CALL gds.graph.project.cypher(
|
||||
"deps",
|
||||
"MATCH (a:Crate) RETURN id(a) AS id",
|
||||
"MATCH (a:Crate)-[:HAS_VERSION]->(v:Version) WITH a, v ORDER BY v.name DESC WITH a, collect(v.name)[0] AS vn MATCH (a:Crate)-[:HAS_VERSION]->(v:Version {name: vn})-[:DEPENDS_ON]->(c:Crate) RETURN id(a) AS source, id(c) AS target"
|
||||
) YIELD
|
||||
graphName,
|
||||
nodeQuery,
|
||||
nodeCount,
|
||||
relationshipQuery,
|
||||
relationshipCount,
|
||||
projectMillis
|
||||
```
|
||||
|
||||
```text
|
||||
╒═════════╤═════════════════════════╤═════════╤═════════════════════════╤═════════════════╤═════════════╕
|
||||
│graphName│nodeQuery │nodeCount│relationshipQuery │relationshipCount│projectMillis│
|
||||
╞═════════╪═════════════════════════╪═════════╪═════════════════════════╪═════════════════╪═════════════╡
|
||||
│"deps" │"MATCH (a:Crate) RETURN i│105287 │"MATCH (a:Crate)-[:HAS_VE│537154 │8272 │
|
||||
│ │d(a) AS id" │ │RSION]->(v:Version) WITH │ │ │
|
||||
│ │ │ │a, v ORDER BY v.name DESC│ │ │
|
||||
│ │ │ │ WITH a, collect(v.name)[│ │ │
|
||||
│ │ │ │0] AS vn MATCH (a:Crate)-│ │ │
|
||||
│ │ │ │[:HAS_VERSION]->(v:Versio│ │ │
|
||||
│ │ │ │n {name: vn})-[:DEPENDS_O│ │ │
|
||||
│ │ │ │N]->(c:Crate) RETURN id(a│ │ │
|
||||
│ │ │ │) AS source, id(c) AS tar│ │ │
|
||||
│ │ │ │get" │ │ │
|
||||
└─────────┴─────────────────────────┴─────────┴─────────────────────────┴─────────────────┴─────────────┘
|
||||
```
|
||||
|
||||
|
||||
<!-- Collegamenti -->
|
||||
|
@ -100,4 +199,7 @@ Per installare la [Graph Data Science Library], si è cliccato sul nome del data
|
|||
[introduzione della relazione del progetto a tema Neo4J]: https://github.com/Steffo99/unimore-bda-4#introduzione
|
||||
[thesaurus]: https://github.com/rust-lang/crates.io/blob/master/src/boot/categories.toml
|
||||
[crater]: https://github.com/rust-lang/crater
|
||||
[Graph Data Science Library]: https://neo4j.com/docs/graph-data-science/current/
|
||||
[Graph Data Science Library]: https://neo4j.com/docs/graph-data-science/current/
|
||||
[Graph Catalog]: https://neo4j.com/docs/graph-data-science/current/management-ops/graph-catalog-ops/
|
||||
[`gds.graph.project.cypher`]: https://neo4j.com/docs/graph-data-science/current/management-ops/projections/graph-project-cypher/
|
||||
[`gds.graph.project`]: https://neo4j.com/docs/graph-data-science/current/management-ops/projections/graph-project/
|
11
scripts/1-graph-projection.cypher
Normal file
11
scripts/1-graph-projection.cypher
Normal file
|
@ -0,0 +1,11 @@
|
|||
CALL gds.graph.project.cypher(
|
||||
"deps",
|
||||
"MATCH (a:Crate) RETURN id(a) AS id",
|
||||
"MATCH (a:Crate)-[:HAS_VERSION]->(v:Version) WITH a, v ORDER BY v.name DESC WITH a, collect(v.name)[0] AS vn MATCH (a:Crate)-[:HAS_VERSION]->(v:Version {name: vn})-[:DEPENDS_ON]->(c:Crate) RETURN id(a) AS source, id(c) AS target"
|
||||
) YIELD
|
||||
graphName,
|
||||
nodeQuery,
|
||||
nodeCount,
|
||||
relationshipQuery,
|
||||
relationshipCount,
|
||||
projectMillis
|
Loading…
Reference in a new issue