site:enseignement:master:bdle:tmes:graphes-neo4j
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
site:enseignement:master:bdle:tmes:graphes-neo4j [25/01/2018 12:22] – camelia | site:enseignement:master:bdle:tmes:graphes-neo4j [24/01/2020 12:12] (Version actuelle) – camelia | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
* Télécharger Neo4J à cette adresse [[https:// | * Télécharger Neo4J à cette adresse [[https:// | ||
* Installer | * Installer | ||
- | * Ouvrir le navigateur Web et aller à cette adresse: | + | * Créer une base de données graphe ("New Graph" puis " |
+ | * Une fois la BD lancée cliquer sur " | ||
* Voir la description de l' | * Voir la description de l' | ||
* Voir la [[http:// | * Voir la [[http:// | ||
+ | * Voir [[site: | ||
- | Le graphe qui sera utilisé pendant le TME représente des personnages de la bande dessinée " | + | Le graphe qui sera utilisé pendant le TME représente des personnages de la bande dessinée " |
== Création du graphe == | == Création du graphe == | ||
- | Créer et visualiser le graphe en copiant dans la ligne de commande les instructions présentes dans le fichier | + | Créer et visualiser le graphe en copiant dans la ligne de commande les instructions présentes dans le fichier. |
- | == Interrogation == | + | Après l' |
- | Écrire les requêtes suivantes: | + | |
+ | <fc # | ||
- | q1) Visualiser | + | Remarque: pour passer à la ligne suivante dans la ligne de commande du browser Neo4J dans le cas d'une requête sur plusieurs lignes utiliser **Shift+Enter**. Pour exécuter une commande sur plusieurs lignes utiliser **Ctrl+Enter**. |
- | <showif isloggedin> | + | Exemple de données (voir également la [[https:// |
- | **Réponse** | + | * noeuds |
< | < | ||
- | match (n)-[r]-> | + | " |
- | return n, r, m | + | " |
+ | " | ||
+ | " | ||
</ | </ | ||
- | </showif> | + | * noeuds <fc # |
- | + | ||
- | q2) Ajouter une étiquette :PERSONNAGE aux noeuds qui ont une propriété " | + | |
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
+ | " | ||
+ | " | ||
+ | " | ||
</ | </ | ||
- | </showif> | + | * noeuds |
- | + | ||
- | + | ||
- | q3) Compter le nombre | + | |
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | Match (n) | + | " |
- | return count(n) | + | " |
</ | </ | ||
- | </showif> | + | * noeuds de type<fc #008080> nationalité</fc>, par exemple: |
- | + | ||
- | q) Compter le nombre d' | + | |
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r]-> | + | " |
- | return count(r) | + | " |
- | Résultat: 67 | + | |
</ | </ | ||
- | </showif> | + | * arcs dirigés avec une étiquette <fc # |
+ | * arcs dirigés avec une étiquette <fc # | ||
+ | * arcs dirigés avec une étiquette <fc # | ||
+ | * arcs dirigés avec une étiquette <fc # | ||
- | q) Trouver l' | + | == Interrogation == |
+ | Écrire les requêtes suivantes: | ||
- | <showif isloggedin> | + | Q1) Visualiser le graphe |
- | **Réponse** | + | |
- | < | + | |
- | match (n) | + | |
- | where n.name = 'Jules Cesar' | + | |
- | return labels(n) | + | |
- | Résultat: [" | + | |
- | </ | + | |
- | </ | + | |
- | q) Trouver l' | ||
- | <showif isloggedin> | + | Q2) Ajouter une étiquette |
- | **Réponse** | + | |
- | < | + | |
- | match (n {name: 'Le Domaine des dieux' | + | |
- | return distinct type(r) | + | |
- | Réponse: APPARAIT_DANS | + | |
- | !! Attention à la casse pour name | + | |
- | </ | + | |
- | </ | + | |
- | q) Afficher toutes les propriétés des trois noeuds parmi les noeuds de type PERSONNAGE: | + | '' |
- | <showif isloggedin> | + | Q3) Compter le nombre de noeuds. |
- | **Réponse** | + | |
- | < | + | |
- | match (n: | + | |
- | return * limit 3 | + | |
- | {" | + | '' |
- | │tres"," | + | |
- | ├──────────────────────────────────────────────────────────────────────┤ | + | |
- | │{" | + | |
- | │es autres"," | + | |
- | ├──────────────────────────────────────────────────────────────────────┤ | + | |
- | │{" | + | |
- | │s"," | + | |
- | </ | + | |
- | </ | + | |
- | q) | + | Q4) |
- | <showif isloggedin> | ||
- | **Réponse** | ||
- | < | ||
- | match (n: | ||
- | where NOT (p)-[: | ||
- | return distinct p.name | ||
- | !!NOT (p)-[r:COMPAGNON_AVENTURE]-> | + | '' |
- | —————————— | + | |
- | ou: | + | |
- | match (p: | + | |
- | where NOT (p)-[: | + | |
- | return distinct p.name | + | |
+ | Q5) Trouver l' | ||
- | Résultat: "Cesarion (Ptolemee XVI)" | + | '' |
- | " | + | '' |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | </ | + | |
- | </ | + | |
+ | Q6) Trouver l' | ||
- | q)Afficher deux triangles (on considère le graphe comme étant non-dirigé) | + | '' |
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
- | < | + | |
- | Match (a)--(b)--(c)--(a) | + | |
- | return distinct a, b, c | + | |
- | limit 2 | + | |
- | </ | + | |
- | </ | + | |
- | q) Afficher les noms des trois couples | + | Q7) Afficher |
- | + | Réponse: | |
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match (p1)-[:APPARAIT_DANS]-> | + | { |
- | where p1 <> p2 | + | " |
- | return distinct p1.name, p2.name, | + | " |
- | + | " | |
- | Résultat: | + | " |
- | "Cleopatre"│"Numerobis" | + | } |
- | ├───────────┼─────────────┼───────────┤ | + | { |
- | │"Cleopatre"│"Jules Cesar"│6 │ | + | " |
- | ├───────────┼─────────────┼───────────┤ | + | "nationalite": "Romain/ |
- | │"Cleopatre"│"Numerobis" | + | " |
+ | " | ||
+ | } | ||
+ | { | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | "personnagetype": "Les Romains" | ||
+ | } | ||
</ | </ | ||
- | </ | ||
- | q) Afficher | + | Q8) Afficher les noms des personnages |
- | le nombre d' | + | |
- | Chaque couple de personnages doit apparaître une seule fois. Trier par nombre total d'albums décroissant. | + | |
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r: | + | " |
- | (n)-[t: | + | " |
- | where n.name < m.name | + | "Brutus" |
- | return distinct n.name, m.name, | + | "Assurancetourix" |
- | order by total desc | + | "Briseradius" |
- | + | "Epidemais" | |
- | Résultat: | + | "Lupus" |
- | " | + | |
- | " | + | |
- | "Caius Obtus" | + | |
- | "Caligula Alavacomgetepus" | + | |
- | "Cesarion (Ptolemee XVI)" | + | |
</ | </ | ||
- | </ | + | Q9) Calculer les triangles du graphe et afficher seulement deux parmi ces triangles (pour chacun de ces deux triangles afficher les noms des noeuds correspondants). On considère le graphe comme étant non-dirigé. |
- | q) Modifier la requête précédente afin d' | + | Réponse: |
- | dont la valeur est le nombre total d' | + | |
- | + | ||
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r: | + | "Les Romains" |
- | (n)-[t: | + | "Caius Obtus" |
- | where n.name < m.name | + | |
- | with n, m, t, count(distinct r) as total | + | |
- | set t.albums = total | + | |
- | return distinct n.name, m.name, t.albums | + | |
</ | </ | ||
- | </ | ||
- | q) Afficher pour chaque noeud son nom et son le degré. Ordonner par ordre croissant des degrés. Considérer uniquement les arcs de type | ||
- | NATIONALITE et PERSONNAGE_TYPE. | ||
- | | ||
- | <showif isloggedin> | ||
- | **Réponse** | ||
- | < | ||
- | match (n)-[r: | ||
- | return n.name, count(distinct r) as degree | ||
- | order by degree | ||
- | </ | ||
- | </ | ||
- | q) Degré total des noeuds | + | Q10) |
- | - Afficher pour chaque valeur de degré le nombre de noeuds avec ce degré. Considérer tous les arcs, ordonner par degré. | + | Réponse: |
- | - Pour chaque noeud enregistrer son degré somme nouvelle propriété. | + | |
- | + | ||
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r]-() | + | "Jules Cesar" |
- | with n as nodes, count(distinct r) as degree | + | " |
- | return degree, count(nodes) order by degree asc | + | "Jules Cesar" |
+ | </ | ||
- | match (n)-[r]-() | + | Q11) Afficher le sous-graphe des personnages reliés par des arcs de type COMPAGNON_AVENTURE qui ne contient pas ' |
- | with n, count(distinct r) as degree | + | |
- | set n.deg = degree | + | |
- | return n.name, n.deg | + | |
- | </ | + | Réponse: |
- | </ | + | |
- | + | ||
- | q) Afficher pour chaque noeud son nom et son degré sortant. Pour les noeuds sans liens sortants afficher 0. Ordonner par ordre décroissant des degrés. Considérer uniquement les arcs de type | + | |
- | NATIONALITE et PERSONNAGE_TYPE. | + | |
- | + | ||
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r: | + | afficher les propriétés de 9 noeuds et 11 arcs de type |
- | return distinct n.name as Node, count(r) as Outdegree | + | |
- | order by Outdegree | + | |
- | + | ||
- | union | + | |
- | + | ||
- | match (a)-[r: | + | |
- | where not((b)-[:COMPAGNON_AVENTURE]->()) | + | |
- | return distinct b.name as Node, 0 as Outdegree | + | |
</ | </ | ||
- | </ | ||
- | + | Q12) Afficher le sous-graphe contenant comme noeuds source ' | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | q) Afficher le sous-graphe contenant comme noeuds source ' | + | |
comme noeuds destination ' | comme noeuds destination ' | ||
de type COMPAGNON_AVENTURE. | de type COMPAGNON_AVENTURE. | ||
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | < |
- | < | + | |
- | match (n)-[: | + | |
- | where n.name in [' | + | |
- | return distinct n.personnageid, | + | |
- | + | ||
- | Résultat: | + | |
- | ════════════════╪════════════════╡ | + | |
│56 │44 │ | │56 │44 │ | ||
├────────────────┼────────────────┤ | ├────────────────┼────────────────┤ | ||
Ligne 274: | Ligne 152: | ||
└────────────────┴────────────────┘ | └────────────────┴────────────────┘ | ||
</ | </ | ||
- | </ | ||
- | q) Afficher le sous-graphe | + | Q13) Afficher le sous-graphe |
+ | qui les relient. On considère uniquement les arcs dirigés de type COMPAGNON_AVENTURE. | ||
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | |
< | < | ||
- | match (n)-[r:COMPAGNON_AVENTURE]->(m) | + | 10 noeuds de type PERSONNAGE et 14 arcs de type COMPAGNON_AVENTURE |
- | where n.name <> ' | + | |
- | return n, m | + | |
</ | </ | ||
- | </ | ||
+ | Q14) Afficher le plus court chemin et sa longueur entre Jules Cesar et Epidemais. | ||
+ | Réponse: | ||
+ | < | ||
+ | 3 noeuds PERSONNAGE, 3 arcs de type COMPAGNON_AVENTURE, | ||
+ | </ | ||
+ | Q15) Afficher le plus long chemin de type COMPAGNON_AVENTURE et sa longueur entre Jules Cesar et Brutus (graphe non-dirigé). | ||
- | q) Afficher le sous-graphe contenant les noeuds qui se trouvent à une distance 3 de ' | + | Réponse: |
- | qui les relient. On considère uniquement les arcs dirigés de type COMPAGNON_AVENTURE. | + | |
- | + | ||
- | <showif isloggedin> | + | |
- | **Réponse** | + | |
< | < | ||
- | match p=(a)-[:COMPAGNON_AVENTURE*3..3]-> | + | 5 noeuds PERSONNAGE, 7 arcs de type COMPAGNON_AVENTURE, longueur de chemin : 7 |
- | where a.name=' | + | |
- | return p | + | |
</ | </ | ||
- | </ | ||
- | q) Afficher le plus court chemin | + | Q16) Afficher |
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | |
< | < | ||
- | match p=shortestPath((a)-[: | + | "Les Romains" |
- | where a.name=' | + | " |
- | return p, length(p) | + | "Les autres" |
- | </code> | + | </ |
- | </showif> | + | |
- | q) Afficher | + | Q17) Afficher |
- | + | le nombre d' | |
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | |
< | < | ||
- | match p=(a)-[: | + | " |
- | where a.name=' | + | " |
- | return p, length(p) | + | " |
- | order by length(p) desc Limit 1 | + | "Caius Obtus" |
+ | " | ||
</ | </ | ||
- | </ | ||
- | q) Afficher les noms des personnages sur le plus court chemin | + | Q18) Modifier la requête précédente afin d' |
- | (utiliser | + | dont la valeur est le nombre total d' |
- | <showif isloggedin> | + | Réponse: |
- | **Réponse** | + | |
< | < | ||
- | match p=shortestPath((a)-[: | + | " |
- | where a.name=' | + | " |
- | RETURN EXTRACT(n IN NODES(p)| n.name) AS Paths | + | "Caius Obtus" "Jules Cesar" |
- | + | " | |
- | Résultat: | + | "Cleopatre" |
- | ["Numerobis", " | + | |
</ | </ | ||
- | </ | ||
- | q) | + | Q19) Degré total des noeuds |
- | <showif isloggedin> | + | - Afficher pour chaque valeur de degré le nombre de noeuds avec ce degré. Considérer tous les arcs, ordonner par degré. |
- | **Réponse** | + | - Pour chaque noeud enregistrer son degré comme nouvelle propriété. Affichez les 3 premières noeuds avec le degré le plus élevé. |
+ | |||
+ | Chacune de ces questions impliquent un enchaînement de deux opérations (utiliser WITH). | ||
+ | |||
+ | Réponse: | ||
< | < | ||
- | match (n: | + | 1 23 |
- | where n <> | + | 2 2 |
- | with n, m | + | 3 7 |
- | match p=shortestPath((n)-[: | + | 4 2 |
- | return n.name, m.name, length(p) | + | 5 2 |
- | order by length(p) desc limit 1 | + | 6 3 |
+ | 9 1 | ||
+ | 10 1 | ||
+ | 31 1 | ||
+ | </code> | ||
+ | et | ||
+ | <code> | ||
+ | "Jules Cesar" | ||
+ | " | ||
+ | "Caius Obtus" | ||
</ | </ | ||
- | </ | ||
- | q) Afficher les noms des noeuds sur tous les plus courts chemins entre Numerobis et Assurancetourix. Afficher uniquement les plus courts | ||
- | chemins contenant plus de 4 noeuds (utiliser la fonction EXTRACT)(graphe non-dirigé). | ||
- | <showif isloggedin> | ||
- | **Réponse** | ||
- | < | ||
- | MATCH p = allShortestPaths((Source)-[: | ||
- | WHERE source.name=' | ||
- | RETURN distinct EXTRACT(n IN NODES(p)| n.name) AS Paths, | ||
- | Réponse: | + | Q20) Afficher pour chaque noeud son nom et son degré sortant. Pour les noeuds sans liens sortants afficher 0. Ordonner par ordre décroissant des degrés. Considérer uniquement les arcs de type |
+ | NATIONALITE et PERSONNAGE_TYPE. | ||
- | [" | ||
- | [" | ||
- | </ | ||
- | </ | ||
- | q) | ||
+ | Q21) Afficher les noms des personnages sur le plus court chemin de type COMPAGNON_AVENTURE entre Numerobis et Assurancetourix | ||
+ | (utiliser la fonction EXTRACT) (graphe non-dirigé). | ||
+ | Q22) Afficher le diamètre du graphe en considérant uniquement les noeuds de type PERSONNAGE et les arcs de type COMPAGNON_AVENTURE | ||
- | q) Effacer tous les noeuds et leur arcs | ||
- | <showif isloggedin> | ||
- | **Réponse** | ||
- | < | ||
- | Match(n)-[r]-() | ||
- | delete n, r | ||
- | </ | ||
- | </ | ||
- | q) Effacer | + | Q23) Afficher les noms des noeuds sur tous les plus courts chemins entre Numerobis et Assurancetourix. Afficher uniquement les plus courts |
+ | chemins contenant plus de 4 noeuds (utiliser la fonction EXTRACT)(graphe non-dirigé). | ||
- | <showif isloggedin> | + | |
- | **Réponse** | + | Q24) On considère la propriété ' |
- | < | + | qui considère ces poids (même résultat que celui obtenu avec l' |
- | match (n) delete n | + | et leur poids (aide (utiliser shortestPath... WITH REDUCE): WITH REDUCE(dist = 0, rel in rels(path) | dist+rel.albums)). |
- | </ | + | |
- | </ | + | |
+ | Q25) Effacer tous les noeuds et leur arcs | ||
+ | |||
+ | |||
+ | Q26) Effacer tous les nodes qui n'ont pas d'arcs | ||
site/enseignement/master/bdle/tmes/graphes-neo4j.1516879359.txt.gz · Dernière modification : de camelia