orpreaching to the converted
the things I do for free beer
neo4jor
a case study
Background
Github
BlogMe
kouphax
http://yobriefca.seWORKS_FOR
Github
BlogMe http://yobriefca.se
@kouphax
WORKS_FOR
kouphax
Kainos
Github
BlogMeWORKS_FORINVOLVED_WITH
Kainos WORKS_FORGDS INVOLVED_WITH
ERTP
Innovations
Licensify
TEAM_WITHIN
GDSINVOLVED_WITH
ERTP
Innovations
Licensify
TEAM_WITHIN
GDS
ERTP
Innov
ation
s
Licen
sify
Cab Off. TEAM_WITHINDEPARTMENT_OF INVOLVED_WITH
ERTP
Cab Off. TEAM_WITHINGov. DEPARTMENT_OFDEPARTMENT_OF
Gov. DEPARTMENT_OFDFID DEPARTMENT_OF
PUBLISHES_TO
WON_WORK_WITH
Gov. DEPARTMENT_OFDFID DEPARTMENT_OF
PUBLISHES_TO
WON_WORK_WITH
DFID DEPARTMENT_OF
PUBLISHES_TO
WON_WORK_WITHKainosWORKS_FOR
KainosWORKS_FORMe WON_WORK_WITHSOMEHOW_RELATED
WORKS_FORMe SOMEHOW_RELATED Me
AidPlatform
The ability to trace all money spentthrough its entire journey from source
to its final destination
IATI XMLDFID Website
DFID SystemsDFID SystemsDFID Systems
X
Aid Platform IATI XML
DFID SystemsDFID SystemsDFID Systems
Aid P
latfo
rm
IATI XML
IATI XML
IATI XML
IATI XML
IATI XML
IATI XML
IATI XML
TheSolution
Data Access
Data Loader
JVM/Scala
Play! 2
jQuery/D3
Persistence
TileStream
Leaflet
IATI XMLIATI XML
Region Country Organisation Budget
Project ComponentTransaction Disbursement
Location Results Document
#1
hell is other people’s api
OIPA API
JVM/Scala
Play! 2
jQuery/D3
MySQL
TileStream
Leaflet
IATI XMLIATI XML
#2
relational databases are a lie
Anorm/Migrations
Data Loader
JVM/Scala
Play! 2
jQuery/D3
PostgreSQL
TileStream
Leaflet
IATI XMLIATI XML
#3
once you go graph...
Neo4J
Data Loader
JVM/Scala
Play! 2
jQuery/D3
TileStream
Leaflet
IATI XMLIATI XML
val org = createNode(orgModel)val country = createNode(countryModel)
org --> “HAS_RECIPIENT_COUNTRY” --> country
neo4j-scala
val index = getNodeIndex("activity").getval node = index.get("id",id).getSingle
val budgets = node.doTraverse[Budget]( follow ->- “HAS_BUDGET”){ END_OF_GRAPH}{ ALL_BUT_START_NODE}
neo4j-scala
query[Node](""" | START global=node(0) | MATCH global-[:IS_SUB_LOCATION]->location<-[:IS_RECIPIENT]-component-[:IS_COMPONENT_OF]->n | RETURN DISTINCT n | ORDER BY n.projectBudget desc | LIMIT 5""".stripMargin).map(_.toCC[Activity])
neo4j-scala
TheFuture