Skip to content

Instantly share code, notes, and snippets.

@FrancescoSaverioZuppichini
Last active May 10, 2016 17:53
Show Gist options
  • Save FrancescoSaverioZuppichini/0a9dd67cae23ceea11df83b4c7d14f40 to your computer and use it in GitHub Desktop.
Save FrancescoSaverioZuppichini/0a9dd67cae23ceea11df83b4c7d14f40 to your computer and use it in GitHub Desktop.

DIVINA COMMEDIA

Introduction

This is a Divina Commedia graph-style database

Setup

CREATE
    (DivinaCommedia:Book{title: 'Divina Commedia', published: 1321})
CREATE
  (Dante:Person {name: 'Dante Alighieri'})-[:CharacterOf]->(DivinaCommedia),
  (Virgilio:Person {name: 'Virgilio'})-[:CharacterOf]->(DivinaCommedia),
  (Beatrice:Person {name: 'Beatrice'})-[:CharacterOf]->(DivinaCommedia),
  (CelestinoIV:Person {name: 'Celestino IV'})-[:CharacterOf{where: "Antinferno"}]->(DivinaCommedia),

  (Caronte:Person {name: 'Caronte'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),
  (Farinata:Person {name: 'Farinata degli Uberti'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),
  (PierdellaVigna:Person {name: 'Pier della Vigna'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),
  (Paolo:Person {name: 'Paolo Malatesta'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),
  (Francesca:Person {name: 'Francesca da Polenta'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),
  (Ulisse:Person {name: 'Ulisse'})-[:CharacterOf{where: "Inferno"}]->(DivinaCommedia),

  (OttavianoAugusto:Person {name: 'Ottaviano Augusto'})-[:CharacterOf{where: "Purgatorio"}]->(DivinaCommedia),
  (Omero:Person {name: 'Omero'})-[:CharacterOf{where: "Purgatorio"}]->(DivinaCommedia),
  (Matelda:Person {name: 'Matelda'})-[:CharacterOf{where: "Purgatorio"}]->(DivinaCommedia),

  (SanTommasoDaquino:Person {name: 'San Tommaso d\'Aquino'})-[:CharacterOf{where: "Paradiso"}]->(DivinaCommedia),
  (Costantino:Person {name: 'Costantino'})-[:CharacterOf{where: "Paradiso"}]->(DivinaCommedia),
  (Cristo:Person {name: 'Cristo'})-[:CharacterOf{where: "Paradiso"}]->(DivinaCommedia),

  (Dante)-[:AUTHOR]->(:Book{title: 'Divina Commedia'})

Paolo and Francesca

Are we missing something, yes of course! Paolo and Francesca were lovers, let’s fix it:

MATCH(Paolo:Person{name:"Paolo Malatesta"}),(Francesca:Person{name:"Francesca da Polenta"})
CREATE
  (Paolo)-[:InLove]->(Francesca),
  (Francesca)-[:InLove]->(Paolo)

Querying

Let’s find out the bad guys!

MATCH(p:Person)-[CharacterOf { where:'Inferno' }]->(Book {title: 'Divina Commedia'})
RETURN p.name

All the protagonist

MATCH (p:Person)-[:CharacterOf]->(Book {title: 'Divina Commedia'})
RETURN p.name

Where is 'Omero'

MATCH(p:Person {name : 'Omero'})-[r:CharacterOf]->(Book {title: 'Divina Commedia'})
RETURN r.where

Quotation

This guys are not speaking, let’s add some nice quotations

MATCH(p:Person {name : 'Ulisse'}),(p1:Person {name : 'Francesca da Polenta'})
SET p +={quotation : "Fatti non foste per viver come bruti, ma per seguir virtute e canoscenza"}
SET p1 +={quotation : "Amor, ch\'a nullo amato amar perdona"}

Now you can say something

MATCH(p:Person)
WHERE exists(p.quotation)
RETURN p.name + " says " + "\'" + p.quotation + "\'"

Created by Francesco Saverio Zuppichini

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment