mirror of
https://github.com/Steffo99/unimore-bda-5.git
synced 2024-11-21 23:54:24 +00:00
Scrivi Degree centrality
This commit is contained in:
parent
345eb65f37
commit
2b5db7dfdf
2 changed files with 87 additions and 39 deletions
110
README.md
110
README.md
|
@ -58,7 +58,7 @@ Alcuni esempi di casi in cui il dato di importanza delle crate potrebbe essere u
|
||||||
- determinare le crate più a rischio di supply chain attack
|
- determinare le crate più a rischio di supply chain attack
|
||||||
- prioritizzare determinate crate nell'esecuzione di esperimenti con [crater]
|
- prioritizzare determinate crate nell'esecuzione di esperimenti con [crater]
|
||||||
|
|
||||||
Lo scopo di questa ricerca è quello di determinare, attraverso indagini sulla rete di dipendenze, un valore di importanza per ciascuna crate, e una classifica delle 25 crate più importanti dell'indice.
|
Lo scopo di questa ricerca è quello di determinare, attraverso indagini sulla rete di dipendenze, un valore di importanza per ciascuna crate, e una classifica delle 10 crate più importanti dell'indice.
|
||||||
|
|
||||||
### 2️⃣ Quali potrebbero essere altre *categories* utilizzabili per classificare crate?
|
### 2️⃣ Quali potrebbero essere altre *categories* utilizzabili per classificare crate?
|
||||||
|
|
||||||
|
@ -116,17 +116,11 @@ MATCH (a:Crate)
|
||||||
RETURN id(a) AS id
|
RETURN id(a) AS id
|
||||||
```
|
```
|
||||||
|
|
||||||
```text
|
| id |
|
||||||
╒═══╕
|
|---:|
|
||||||
│id │
|
| 0 |
|
||||||
╞═══╡
|
| 1 |
|
||||||
│0 │
|
| 2 |
|
||||||
├───┤
|
|
||||||
│1 │
|
|
||||||
├───┤
|
|
||||||
│2 │
|
|
||||||
├───┤
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Determinazione degli archi partecipanti
|
#### Determinazione degli archi partecipanti
|
||||||
|
|
||||||
|
@ -145,17 +139,11 @@ MATCH (a:Crate)-[:HAS_VERSION]->(v:Version {name: vn})-[:DEPENDS_ON]->(c:Crate)
|
||||||
RETURN id(a) AS source, id(c) AS target
|
RETURN id(a) AS source, id(c) AS target
|
||||||
```
|
```
|
||||||
|
|
||||||
```text
|
| source | target |
|
||||||
╒══════╤══════╕
|
|-------:|-------:|
|
||||||
│source│target│
|
| 98825 | 21067 |
|
||||||
╞══════╪══════╡
|
| 98825 | 16957 |
|
||||||
│98825 │21067 │
|
| 22273 | 21318 |
|
||||||
├──────┼──────┤
|
|
||||||
│98825 │16957 │
|
|
||||||
├──────┼──────┤
|
|
||||||
│22273 │21318 │
|
|
||||||
├──────┼──────┤
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Creazione della graph projection
|
#### Creazione della graph projection
|
||||||
|
|
||||||
|
@ -175,23 +163,67 @@ CALL gds.graph.project.cypher(
|
||||||
projectMillis
|
projectMillis
|
||||||
```
|
```
|
||||||
|
|
||||||
```text
|
| graphName | nodeQuery | nodeCount | relationshipQuery | relationshipCount | projectMillis |
|
||||||
╒═════════╤═════════════════════════╤═════════╤═════════════════════════╤═════════════════╤═════════════╕
|
|-----------|-----------|----------:|-------------------|------------------:|--------------:|
|
||||||
│graphName│nodeQuery │nodeCount│relationshipQuery │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" │"MATCH (a:Crate) RETURN i│105287 │"MATCH (a:Crate)-[:HAS_VE│537154 │8272 │
|
### 1️⃣ Degree Centrality
|
||||||
│ │d(a) AS id" │ │RSION]->(v:Version) WITH │ │ │
|
|
||||||
│ │ │ │a, v ORDER BY v.name DESC│ │ │
|
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.
|
||||||
│ │ │ │ WITH a, collect(v.name)[│ │ │
|
|
||||||
│ │ │ │0] AS vn MATCH (a:Crate)-│ │ │
|
Prima di eseguire l'algoritmo, si [stimano] le risorse computazionali richieste:
|
||||||
│ │ │ │[:HAS_VERSION]->(v:Versio│ │ │
|
|
||||||
│ │ │ │n {name: vn})-[:DEPENDS_O│ │ │
|
```cypher
|
||||||
│ │ │ │N]->(c:Crate) RETURN id(a│ │ │
|
CALL gds.degree.stream.estimate(
|
||||||
│ │ │ │) AS source, id(c) AS tar│ │ │
|
"deps",
|
||||||
│ │ │ │get" │ │ │
|
{
|
||||||
└─────────┴─────────────────────────┴─────────┴─────────────────────────┴─────────────────┴─────────────┘
|
// Di default l'algoritmo conteggia gli archi uscenti di ciascun nodo; con questo parametro, il comportamento si inverte
|
||||||
|
orientation: "REVERSE"
|
||||||
|
}
|
||||||
|
) YIELD
|
||||||
|
nodeCount,
|
||||||
|
relationshipCount,
|
||||||
|
bytesMin,
|
||||||
|
bytesMax,
|
||||||
|
requiredMemory
|
||||||
```
|
```
|
||||||
|
|
||||||
|
| nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
|
||||||
|
|----------:|------------------:|---------:|---------:|---------------:|
|
||||||
|
| 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:
|
||||||
|
|
||||||
|
```cypher
|
||||||
|
CALL gds.degree.stream(
|
||||||
|
"deps",
|
||||||
|
{
|
||||||
|
// Di default l'algoritmo conteggia gli archi uscenti di ciascun nodo; con questo parametro, il comportamento si inverte
|
||||||
|
orientation: "REVERSE"
|
||||||
|
}
|
||||||
|
) 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" | 24612.0 | "A generic serialization/deserialization framework" |
|
||||||
|
| "serde_json" | 16365.0 | "A JSON serialization file format" |
|
||||||
|
| "log" | 12134.0 | "A lightweight logging facade for Rust" |
|
||||||
|
| "tokio" | 11298.0 | "An event-driven, non-blocking I/O platform for writing asynchronous I/Obacked applications." |
|
||||||
|
| "clap" | 10066.0 | "A simple to use, efficient, and full-featured Command Line Argument Parser" |
|
||||||
|
| "rand" | 9993.0 | "Random number generators and other randomness functionality." |
|
||||||
|
| "thiserror" | 8615.0 | "derive(Error)" |
|
||||||
|
| "anyhow" | 8130.0 | "Flexible concrete Error type built on std::error::Error" |
|
||||||
|
| "futures" | 7398.0 | "An implementation of futures and streams featuring zero allocations,composability, and iterator-like interfaces." |
|
||||||
|
| "lazy_static" | 7118.0 | "A macro for declaring lazily evaluated statics in Rust." |
|
||||||
|
|
||||||
|
|
||||||
<!-- Collegamenti -->
|
<!-- Collegamenti -->
|
||||||
|
|
||||||
|
@ -203,3 +235,5 @@ CALL gds.graph.project.cypher(
|
||||||
[Graph Catalog]: https://neo4j.com/docs/graph-data-science/current/management-ops/graph-catalog-ops/
|
[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.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/
|
||||||
|
[stimano]: https://neo4j.com/docs/graph-data-science/current/common-usage/memory-estimation/
|
14
scripts/1-degree-centrality.cypher
Normal file
14
scripts/1-degree-centrality.cypher
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
CALL gds.degree.stream(
|
||||||
|
"deps",
|
||||||
|
{
|
||||||
|
// Di default l'algoritmo conteggia gli archi uscenti di ciascun nodo; con questo parametro, il comportamento si inverte
|
||||||
|
orientation: "REVERSE"
|
||||||
|
}
|
||||||
|
) 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
|
Loading…
Reference in a new issue