Skip to content
This repository was archived by the owner on Apr 12, 2019. It is now read-only.

Commit 339eae4

Browse files
committed
group3 initial setup
1 parent 5e49b56 commit 339eae4

File tree

7 files changed

+294
-0
lines changed

7 files changed

+294
-0
lines changed

RelationshipsG3/README.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# README
2+
3+
## Model
4+
5+
### Nodes
6+
7+
* `Piece`
8+
* `Composer`
9+
* `Type`
10+
* `Key`
11+
* `User`
12+
13+
### Relationships
14+
15+
* `(:Composer)-[:COMPOSED {role:"some role"}]->(:Movie)`
16+
* `(:Piece)-[:HAS_TYPE]->(:TYPE)`
17+
* `(:Piece)-[:HAS_KEY]->(:Key)`
18+
* `(:User)-[:RATED {rating:"1-5"}]->(:Piece)`
19+
20+
## Database Setup
21+
### Docker Setup
22+
This is the recommended way and should work similarly on Windows.
23+
24+
* Run the Neo4j Docker Container
25+
```
26+
docker run \
27+
--publish=7474:7474 --publish=7687:7687 \
28+
--volume=$HOME/neo4j/data:/data \
29+
--volume=$HOME/neo4j/import:/var/lib/neo4j/import \
30+
--name neo4j \
31+
neo4j
32+
```
33+
* Copy the csv files into the import directory:
34+
```
35+
cp csv/*.csv $HOME/neo4j/import
36+
```
37+
* Initialize the database:
38+
```
39+
docker exec -i neo4j bin/cypher-shell -u neo4j -p neo < ./setup.cql
40+
```
41+
42+
### Local Install
43+
As an alternative to Docker you can also install Neo4j locally
44+
* [Download Neo4j Community Edition: .tar Version](https://neo4j.com/download/other-releases/)
45+
* Set your `NEO4J_HOME` variable: `export NEO4J_HOME=/path/to/neo4j-community`
46+
* From this project's root directory, run the import script:
47+
48+
```
49+
docker exec -i my-neo4j bin/neo4j-admin import \
50+
--nodes:Piece /var/lib/neo4j/import/piece_node.csv \
51+
--nodes:User /var/lib/neo4j/import/users_node.csv \
52+
--nodes:Type /var/lib/neo4j/import/type_node.csv \
53+
--relationships:TYPE "/var/lib/neo4j/import/type_rels.csv" \
54+
--delimiter ";" --array-delimiter "|" --id-type INTEGER
55+
$NEO4J_HOME/bin/neo4j-import --into $NEO4J_HOME/data/databases/graph.db --nodes:Person csv/person_node.csv --nodes:Movie csv/movie_node.csv --nodes:Genre csv/genre_node.csv --nodes:Keyword csv/keyword_node.csv --relationships:ACTED_IN csv/acted_in_rels.csv --relationships:DIRECTED csv/directed_rels.csv --relationships:HAS_GENRE csv/has_genre_rels.csv --relationships:HAS_KEYWORD csv/has_keyword_rels.csv --relationships:PRODUCED csv/produced_rels.csv --relationships:WRITER_OF csv/writer_of_rels.csv --delimiter ";" --array-delimiter "|" --id-type INTEGER
56+
```
57+
58+
If you see `Input error: Directory 'neo4j-community-3.0.3/data/databases/graph.db' already contains a database`, delete the `graph.db` directory and try again.
59+
60+
* Add [constraints](https://neo4j.com/docs/developer-manual/current/cypher/#query-constraints) to your database: `$NEO4J_HOME/bin/neo4j-shell < setup.cql -path $NEO4J_HOME/databases/graph.db`
61+
* Start the database: `$NEO4J_HOME/bin/neo4j start`
62+
63+
## Workshop
64+
Let's start with taking a look at the current state of the database.
65+
Therefore open the Neo4j [browser](http://localhost:7474/browser/).
66+
67+
Take a look at all currently existing Pieces in the database, by entering this command:
68+
```
69+
MATCH (n:Piece) RETURN n;
70+
```
71+
We can also find out which Pieces are Quartets:
72+
```
73+
MATCH (n:Piece)-[:HAS_TYPE]->(:Type {name: 'Quartet'}) RETURN n;
74+
```
75+
76+
Moving on we can also create a new node ourselves. Let's add `Mozart` as a `Composer` to our database:
77+
```
78+
CREATE (n:Composer {name:'Mozart'}) RETURN n;
79+
```
80+
81+
As all the Pieces in the database where composed by Mozart, connect them with a `COMPOSED` relationship:
82+
```
83+
MATCH (m:Composer {name:"Mozart"}), (p:Piece)
84+
CREATE (m)-[:COMPOSED]->(p)
85+
```
86+
87+
As described one of the strength of Graph Databases is the traversal over its paths. This can be used for recommendation systems, for example.
88+
89+
To set this up let's create a few users:
90+
```
91+
LOAD CSV WITH HEADERS FROM "file:///users_node.csv" AS r FIELDTERMINATOR ';'
92+
CREATE (p:User {
93+
id: toInteger(r.`id:ID(User)`),
94+
name: r.name
95+
});
96+
```
97+
98+
Also create a few ratings:
99+
```
100+
MATCH (u:User), (p:Piece)
101+
WITH u, p
102+
WHERE rand() < 0.1
103+
CREATE (u)-[:RATED]->(p)
104+
```
105+
and assign rating scores:
106+
```
107+
MATCH (:User)-[r:RATED]->(:Piece)
108+
SET r.rating = floor(rand()*6)
109+
```
110+
111+
Your task is now to develop an approach to recommend Pieces to a user, based on all information currently stored in the database.

RelationshipsG3/csv/piece_node.csv

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
id:ID(Piece);date;location;work;key
2+
1;1761;Salzburg;Minuet for Harpsichord (See K. 1e);G Major
3+
2;1762;Salzburg;Minuet for Harpsichord;F Major
4+
3;1762;Salzburg;Allegro for Harpsichord;B Flat Major
5+
4;1762;Salzburg;Minuet for Harpsichord;F Major
6+
5;1762;Salzburg;Minuet for Harpsichord;F Major
7+
16;1764;London;Symphony No. 1;E Flat Major
8+
17;1764;London;Symphony No. 2 (Doubtful);B Flat Major
9+
18;1764;London;Symphony No. 3 (copy from K. F. Abel);E Flat Major
10+
26;1766;The Hague;Sonata for Harpsichord & Violin;
11+
27;1766;The Hague;Sonata for Harpsichord & Violin;
12+
41;1767;Salzburg;Concerto for Piano No. 4;
13+
51;1768;Vienna;Opera buffa `La finta semplice';
14+
55;1788;Vienna;Sonata for Piano & Violin (Doubtful);
15+
56;1788;Vienna;Sonata for Piano & Violin (Doubtful);
16+
57;1788;Vienna;Sonata for Piano & Violin (Doubtful);
17+
58;1788;Vienna;Sonata for Piano & Violin (Doubtful);
18+
112;1771;Milan;Symphony No. 13;F Major
19+
113;1771;Milan;Divertimento No. 1;E Flat Major
20+
114;1771;Salzburg;Symphony No. 14;A Major
21+
115;1773;Salzburg;Mass `Missa brevis';C Major
22+
183;1773;Salzburg;Symphony No. 25;G minor
23+
184;1773;Salzburg;Symphony No. 26 (Overture);E Flat Major
24+
185;1773;Vienna;Serenade No. 3 `Finalmusik';D Major
25+
186;1773;Milan;Divertimento No. 4;B Flat Major
26+
187;1773;Salzburg?;Divertimento No. 5;C Major
27+
188;1776;Salzburg;Divertimento No. 6;C Major
28+
189;1773;Vienna;March for Orchestra;D Major
29+
190;1773;Salzburg;Concertone for 2 Violins & Orchestra;C Major
30+
191;1774;Salzburg;Bassoon Concerto;B Flat Major
31+
192;1774;Salzburg;Mass `Missa brevis';F Major
32+
193;1774;Salzburg;Dixit & Magnificat;C Major
33+
194;1774;Salzburg;Mass `Missa brevis';D Major
34+
195;1774;Salzburg;Litaniae Lauretanae;D Major
35+
196;1774;Salzburg;Opera buffa `La finta giardiniera';
36+
367;1781;Munich;Ballet Music to Idomeneo;
37+
569;1789;Vienna;Aria `Ohne Zwang' (lost);
38+
570;1789;Vienna;Sonata for Piano;B Flat Major
39+
573;1789;Potsdam;9 Variations for Piano (Duport);D Major
40+
574;1789;Leipzig;Gigue for Piano;G minor
41+
575;1789;Vienna;Quartet for Strings No. 21;D Major
42+
576;1789;Vienna;Sonata for Piano;D Major
43+
581;1789;Vienna;Quintet for Clarinet & Strings;A Major
44+
587;1789;Vienna;Contredanse for Orchestra;
45+
588;1790;Vienna;Opera buffa `Cosi fan tutte';
46+
589;1790;Vienna;Quartet for Strings No. 22;B Flat Major
47+
590;1790;Vienna;Quartet for Strings No. 23;F Major
48+
598;1791;Vienna;Song with Piano `Wir Kinder';
49+
622;1791;Vienna;Concerto for Clarinet;A Major

RelationshipsG3/csv/type_node.csv

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
id:ID(Type);name
2+
1;Minuet
3+
2;Symphony
4+
3;Sonata
5+
4;Concerto
6+
5;Opera
7+
6;Mass
8+
7;Quartet
9+
8;Quintet
10+
9;Aria

RelationshipsG3/csv/type_rels.csv

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
:START_ID(Piece);:END_ID(Type)
2+
1;1
3+
2;1
4+
4;1
5+
5;1
6+
16;2
7+
17;2
8+
18;2
9+
112;2
10+
114;2
11+
183;2
12+
184;2
13+
26;3
14+
27;3
15+
55;3
16+
56;3
17+
57;3
18+
58;3
19+
570;3
20+
576;3
21+
41;4
22+
190;4
23+
622;4
24+
51;5
25+
196;5
26+
588;5
27+
115;6
28+
192;6
29+
194;6
30+
575;7
31+
589;7
32+
590;7
33+
581;8
34+
569;9

RelationshipsG3/csv/users_node.csv

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
id:ID(User);name
2+
1;Alex
3+
2;Alicia
4+
3;Amber
5+
4;Amelie
6+
5;Andrew
7+
6;Benjamin
8+
7;Brandon
9+
8;Caitlin
10+
9;Cameron
11+
10;Charles
12+
11;Christopher
13+
12;Connor
14+
13;David
15+
14;Dylan
16+
15;Ethan
17+
16;Freddie
18+
17;Gabriel
19+
18;Georgia
20+
19;Isabel
21+
20;Isabella
22+
21;Jack
23+
22;Jake
24+
23;Jasmine
25+
24;Jay
26+
25;Jayden
27+
26;Jessica
28+
27;John
29+
28;Joshua
30+
29;Keira
31+
30;Laura
32+
31;Leon
33+
32;Liam
34+
33;Lilly
35+
34;Lola
36+
35;Lucas
37+
36;Madison
38+
37;Max
39+
38;Michael
40+
39;Mohammed
41+
40;Niamh
42+
41;Nicole
43+
42;Noah
44+
43;Rosie
45+
44;Samuel
46+
45;Sarah
47+
46;Sean
48+
47;Shannon
49+
48;Sienna
50+
49;Sophie
51+
50;Summer
52+
51;Thomas
53+
52;Tyler
54+
53;Zachary

RelationshipsG3/docker-compose.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: '2'
2+
services:
3+
neo4j:
4+
image: "neo4j"
5+
ports:
6+
- "7474:7474"
7+
- "7687:7687"
8+
volumes:
9+
- $HOME/neo4j/data:/data
10+
- $HOME/neo4j/import:/var/lib/neo4j/import

RelationshipsG3/setup.cql

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
CREATE CONSTRAINT ON (n:User) ASSERT n.id IS UNIQUE;
2+
3+
CREATE CONSTRAINT ON (n:Composer) ASSERT n.id IS UNIQUE;
4+
5+
CREATE CONSTRAINT ON (n:Piece) ASSERT n.id IS UNIQUE;
6+
7+
CREATE CONSTRAINT ON (n:Type) ASSERT n.id IS UNIQUE;
8+
9+
LOAD CSV WITH HEADERS FROM "file:///piece_node.csv" AS r FIELDTERMINATOR ';'
10+
CREATE (p:Piece {
11+
id: toInteger(r.`id:ID(Piece)`),
12+
work: r.work,
13+
location: r.location,
14+
year: toInteger(r.date),
15+
key: r.key
16+
});
17+
18+
LOAD CSV WITH HEADERS FROM "file:///type_node.csv" AS r FIELDTERMINATOR ';'
19+
CREATE (p:Type {
20+
id: toInteger(r.`id:ID(Type)`),
21+
name: r.name
22+
});
23+
24+
LOAD CSV WITH HEADERS FROM "file:///type_rels.csv" AS r FIELDTERMINATOR ';'
25+
MATCH (p:Piece {id: toInteger(r.`:START_ID(Piece)`)}), (t:Type {id: toInteger(r.`:END_ID(Type)`)})
26+
CREATE (p)-[:HAS_TYPE]->(t);

0 commit comments

Comments
 (0)