1
Fork 0
mirror of https://github.com/Steffo99/unimore-bda-5.git synced 2024-11-21 23:54:24 +00:00

Scrivi PageRank

This commit is contained in:
Steffo 2023-05-09 04:51:31 +02:00
parent 5c69134801
commit 47114a1f48
Signed by: steffo
GPG key ID: 2A24051445686895
2 changed files with 70 additions and 8 deletions

View file

@ -101,6 +101,10 @@ Esistono vari modi per creare nuove proiezioni, ma all'interno di questa relazio
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. 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.
### Modalità d'uso
<!-- TODO -->
## Analisi ## Analisi
### 1⃣ Realizzazione della *Graph Projection* ### 1⃣ Realizzazione della *Graph Projection*
@ -156,22 +160,20 @@ CALL gds.graph.project.cypher(
"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" "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 ) YIELD
graphName, graphName,
nodeQuery,
nodeCount, nodeCount,
relationshipQuery,
relationshipCount, relationshipCount,
projectMillis projectMillis
``` ```
| graphName | nodeQuery | nodeCount | relationshipQuery | relationshipCount | projectMillis | | graphName | nodeCount | relationshipCount | projectMillis |
|-----------|-----------|----------:|-------------------|------------------:|--------------:| |-----------|----------:|------------------:|--------------:|
| "deps" | "MATCH (a:Crate) RETURN id(a) AS id" | 105287 | "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" | 537154 | 8272 | | "deps" | 105287 | 537154 | 8272 |
### 1⃣ Degree Centrality ### 1⃣ Degree Centrality
Come misura di importanza più basilare, si decide di analizzare la *Degree Centrality*, ovvero il numero di archi entranti che ciascun nodo possiede, utilizzando la funzione [`gds.degree`] in modalità *Stream* per semplicità di operazione. Come misura di importanza più basilare, si decide di analizzare la *Degree Centrality*, ovvero il numero di archi entranti che ciascun nodo possiede, utilizzando la funzione [`gds.degree`] in modalità *Stream* per semplicità di operazione.
Prima di eseguire l'algoritmo, si [stimano] le risorse computazionali richieste: Prima di eseguire l'algoritmo, [si stimano] le risorse computazionali richieste:
```cypher ```cypher
CALL gds.degree.stream.estimate( CALL gds.degree.stream.estimate(
@ -192,7 +194,7 @@ CALL gds.degree.stream.estimate(
|----------:|------------------:|---------:|---------:|---------------:| |----------:|------------------:|---------:|---------:|---------------:|
| 105287 | 537154 | 56 | 56 | "56 Bytes" | | 105287 | 537154 | 56 | 56 | "56 Bytes" |
Dato che la memoria richiesta è una quantità irrisoria, si procede immediatamente con l'esecuzione, e con il recupero delle 10 crate con più dipendenze entranti: Dato che la memoria richiesta stimata per l'esecuzione dell'algoritmo è pochissima, si procede immediatamente con l'esecuzione, e con il recupero delle 10 crate con più dipendenze entranti:
```cypher ```cypher
CALL gds.degree.stream( CALL gds.degree.stream(
@ -224,6 +226,55 @@ LIMIT 10
| [`futures`](https://crates.io/crates/futures) | 7398.0 | "An implementation of futures and streams featuring zero allocations,composability, and iterator-like interfaces." | | [`futures`](https://crates.io/crates/futures) | 7398.0 | "An implementation of futures and streams featuring zero allocations,composability, and iterator-like interfaces." |
| [`lazy_static`](https://crates.io/crates/lazy_static) | 7118.0 | "A macro for declaring lazily evaluated statics in Rust." | | [`lazy_static`](https://crates.io/crates/lazy_static) | 7118.0 | "A macro for declaring lazily evaluated statics in Rust." |
### 1⃣ PageRank
Per ottenere una misura di importanza più elaborata, si è scelto di utilizzare *PageRank*, algoritmo iterativo che dà maggiore rilevanza alle crate con pochi dipendenze e molti dipendenti.
Ancora, prima di eseguire l'algoritmo [si stimano] le risorse richieste:
```cypher
CALL gds.pageRank.stream.estimate(
"deps"
) YIELD
nodeCount,
relationshipCount,
bytesMin,
bytesMax,
requiredMemory
```
| nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
|----------:|------------------:|---------:|---------:|---------------:|
| 105287 | 537154 | 2540880 | 2540880 | "2481 KiB" |
Si osserva come la quantità di memoria richiesta sia significativamente maggiore di quella richiesta dall'algoritmo di *Degree Centrality*, ma sempre una quantità accettabile con le risorse a disposizione dei computer moderni; dunque, si procede con l'esecuzione dell'algoritmo, sempre in modalità *Stream* per semplicità di uso:
```cypher
CALL gds.pageRank.stream(
"deps",
{}
) YIELD
nodeId,
score
MATCH (n)
WHERE ID(n) = nodeId
RETURN n.name AS name, score, n.description AS description
ORDER BY score DESC
LIMIT 10
```
| name | score | description |
|--------------------------|-------------------:|--------------------------------------------------------------------------------------------------------------------------------------|
| [`serde_derive`](https://crates.io/crates/serde_derive) | 2633.874125046063 | "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" |
| [`serde`](https://crates.io/crates/serde) | 2600.440123009119 | "A generic serialization/deserialization framework" |
| [`quote`](https://crates.io/crates/quote) | 1753.385696376074 | "Quasi-quoting macro quote!(...)" |
| [`proc-macro2`](https://crates.io/crates/proc-macro2) | 1547.702293697151 | "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case." |
| [`trybuild`](https://crates.io/crates/trybuild) | 1452.1162055975733 | "Test harness for ui tests of compiler diagnostics" |
| [`rand`](https://crates.io/crates/rand) | 1108.4777776061019 | "Random number generators and other randomness functionality." |
| [`syn`](https://crates.io/crates/syn) | 1047.3719317086066 | "Parser for Rust source code" |
| [`rustc-std-workspace-core`](https://crates.io/crates/rustc-std-workspace-core) | 997.5769831539209 | "Explicitly empty crate for rust-lang/rust integration" |
| [`serde_json`](https://crates.io/crates/serde_json) | 885.3755595284102 | "A JSON serialization file format" |
| [`criterion`](https://crates.io/crates/criterion) | 845.3984645777582 | "Statistics-driven micro-benchmarking library" |
<!-- Collegamenti --> <!-- Collegamenti -->
@ -236,4 +287,4 @@ LIMIT 10
[`gds.graph.project.cypher`]: https://neo4j.com/docs/graph-data-science/current/management-ops/projections/graph-project-cypher/ [`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/ [`gds.graph.project`]: https://neo4j.com/docs/graph-data-science/current/management-ops/projections/graph-project/
[`gds.degree`]: https://neo4j.com/docs/graph-data-science/current/algorithms/degree-centrality/ [`gds.degree`]: https://neo4j.com/docs/graph-data-science/current/algorithms/degree-centrality/
[stimano]: https://neo4j.com/docs/graph-data-science/current/common-usage/memory-estimation/ [si stimano]: https://neo4j.com/docs/graph-data-science/current/common-usage/memory-estimation/

View file

@ -0,0 +1,11 @@
CALL gds.pageRank.stream(
"deps",
{}
) YIELD
nodeId,
score
MATCH (n)
WHERE ID(n) = nodeId
RETURN n.name AS name, score, n.description AS description
ORDER BY score DESC
LIMIT 10