2. • Daglig
leder
i
Monokkel
AS
• Tidligere
COO
i
Integrasco
AS
• Persistering,
Prosessering
og
Presentasjon
av
data
Persistering
–
Prosessering
–
Presentasjon
3. • Aleksander
M.
Stensby
• Daglig
leder
i
Monokkel
AS
• Tidligere
COO
i
Integrasco
AS
www.monokkel.io
4. Agenda
• Intro
@l
grafdatabaser
og
modellering
• Neo4j
og
Cypher
• SpringData
Neo4j
21. «Aleks»
sine
venner
Person
ID
Navn
Venner
PersonID
VennID
SELECT
p1.Person
FROM
Person
p1
JOIN
Venner
ON
Venner.VennID
=
p1.ID
JOIN
Person
p2
ON
Venner.PersonID
=
p2.ID
WHERE
p2.Navn
=
'Aleks'
22. Venner
med
«Aleks»
Person
ID
Navn
Venner
PersonID
VennID
SELECT
p1.Person
FROM
Person
p1
JOIN
Venner
ON
Venner.PersonID
=
p1.ID
JOIN
Person
p2
ON
Venner.VennID
=
p2.ID
WHERE
p2.Navn
=
'Aleks'
23. «Aleks»
sine
venners
venner?
Person
ID
Navn
Venner
PersonID
VennID
SELECT
p1.Person
AS
PERSON,
p2.Person
AS
VENN_AV_VENN
FROM
Venner
v1
JOIN
Person
p1
ON
v1.PersonID
=
p1.ID
JOIN
Venner
v2
ON
v2.VennID
=
v1.VennID
JOIN
Person
p2
ON
v2.VennID
=
p2.
ID
WHERE
p1.Navn
=
'Aleks‘
AND
v2.VennID
<>
p1.ID
26. En
grafdatabase...
• benyper
grafstrukturer
med
– Noder
– Relasjoner
– Apribuper
• @l
å
lagre
informasjon!
• Ypperlig
@l
relasjoner
–
men
ikke
best
på
aggregering
av
data
27. Grafdatabaser
og
neo4j
• Visuelt
–
Skjemaløst!
• Dobbelt-‐lenkede-‐lister
– hver
node
har
en
liste
med
innkommende
og
utgående
relasjoner
• Direkte
lookup
=
O(1)
30. Noder
har
aribuer
ALEKS
TARJEI
Age:
29
First
Name:
Aleksander
Last
Name:
Stensby
Age:
30
First
Name:
Tarjei
Last
Name:
Romtveit
FRIENDS_WITH
31. Relasjoner
kan
også
ha
aribuer
ALEKS
TARJEI
Age:
29
First
Name:
Aleksander
Last
Name:
Stensby
Age:
30
First
Name:
Tarjei
Last
Name:
Romtveit
FRIENDS_WITH
Since:
01.01.2004
32. Relasjoner
kan
gå
flere
veier
ALEKS
TARJEI
FRIENDS_WITH
Since:
01.01.2004
Age:
29
First
Name:
Aleksander
Last
Name:
Stensby
Age:
30
First
Name:
Tarjei
Last
Name:
Romtveit
FRIENDS_WITH
Since:
01.01.2004
33. ALEKS
TARJEI
Age:
29
First
Name:
Aleksander
Last
Name:
Stensby
Age:
30
First
Name:
Tarjei
Last
Name:
Romtveit
FRIENDS_WITH
Since:
01.01.2004
34. forskjellige
ALEKS
TARJEI
Age:
29
First
Name:
Aleksander
Last
Name:
Stensby
Type:
Person
Age:
30
First
Name:
Tarjei
Last
Name:
Romtveit
Type:
Person
typer
FRIENDS_WITH
Since:
01.01.2004
av
noder
51. START
a=node(*)
MATCH
(a:Person
{name:
'Danny
DeVito'}
)
WHERE
a.name='Danny
DeVito'
RETURN
a
Neo4j
2.0.1
52. Venners
venner...
MATCH
(aleks)-‐[:KNOWS*2..2]-‐>(friend_of_friend)
WHERE
aleks.firstName=
'Aleks'
RETURN
friend_of_friend.firstName
53. Venners
venner...
MATCH
(aleks)-‐[:KNOWS*2..2]-‐>(friend_of_friend)
WHERE
aleks.firstName=
'Aleks'
AND
NOT
(aleks)-‐[:KNOWS]-‐>(friend_of_friend)
RETURN
friend_of_friend.firstName
60. Intro
@l
SpringData
Neo4j
• SpringData
• Repositories
• Kjapt
eksempel
på
oppsep
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<ar@factId>spring-‐data-‐neo4j</ar@factId>
<version>3.2.0.RELEASE</version>
</dependency>
</dependencies>
neo4j
2.1.4
spring-‐data-‐neo4j
3.2.0
spring
4.1.0
61. SpringData
Neo4j
Config
@Configuration
@EnableNeo4jRepositories("no.stensby.javabin.neo.repositories")
public
class
Config
extends
Neo4jConfiguration
{
}
@Autowired
protected
Neo4jTemplate
template;
62. SpringData
Neo4j
Config
@Configuration
@EnableNeo4jRepositories("no.stensby.javabin.neo.repositories")
public
class
Config
extends
Neo4jConfiguration
{
public
Config
(){
setBasePackage("no.stensby.javabin.neo.domain");
}
}
@Autowired
protected
Neo4jTemplate
template;
63. SpringData
Neo4j
Config
Embedded:
@Bean
GraphDatabaseService
graphDatabaseService()
{
return
new
GraphDatabaseFactory().newEmbeddedDatabase("tmp/neo4j");
}
REST:
@Bean
GraphDatabaseService
graphDatabaseService()
{
return
new
SpringRestGraphDatabase("http://localhost:7474/db/data");
}
TEST:
@Bean(destroyMethod
=
"shutdown")
@Scope(SCOPE_PROTOTYPE)
public
GraphDatabaseService
graphDatabaseService()
{
return
new
TestGraphDatabaseFactory().newImpermanentDatabase();
}
64. SpringData
Neo4j
-‐
Domene
@NodeEntity
public
class
Person
{
@GraphId
public
Long
nodeId;
@Indexed(unique
=
true)
public
int
id;
public
String
firstName;
public
String
lastName;
}
68. m-‐m
relasjoner
-‐
@RelatedToVia
@Fetch
@RelatedToVia
(type
=
"ACTS_IN")
Set<Role>
roles
=
new
HashSet<Role>();
@Fetch
@RelatedToVia(type
=
"ACTS_IN",
direction
=
Direction.INCOMING)
Set<Role>
cast
=
new
HashSet<Role>();
Movie
Actor
@RelationshipEntity(type
=
"ACTS_IN")
public
class
Role
{
@GraphId
Long
nodeId;
@StartNode
Actor
actor;
@EndNode
Movie
movie;
Role
73. Lessons
Learned
• Vær
forsik@g
med
versjoner
og
oppgraderinger…
– Neo
1.9.x
-‐>
Neo
2.x
kan
by
på
mange
problemer
– Mange
breaking
changes
underveis…
– Spring
Data
Neo4j
!=
Neo4j
• Noder
er
“first-‐class”
ci@zens
I
grafen
– Hyperedges
støpes
ikke
-‐>
kan
bruke
“event
nodes”
• Dyrt
å
aggregere
-‐
caching
av
stats
på
noder!
• Unike
og
ekspressive
relasjonstyper
74. Pi…alls
• Ikke
bruk
graphid
som
ID
• Ini@aliser
alle
Set
• Bruk
@Fetch,
men
vær
forsik@g
• Bruk
standard
gepers/sepers
• Vær
varsom
med
String
escaping
75. Inspirasjon
• Single
Malt
Scotch
Whisky
hpp://gist.neo4j.org/?8139605
• Chess
Games
and
Posiaons
hpp://gist.neo4j.org/?6506717
• Movie
Recommendaaons
hpp://gist.neo4j.org/?8173017
• Food
Recipes
Recommendaaon
hpp://gist.neo4j.org/?8731452