Last active
June 9, 2020 09:47
-
-
Save rvanbruggen/e8556e27dc972aa86ee3aef8c50c3b2b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//find at https://github.com/neo4j-contrib/neo4j-faker | |
//release at https://github.com/neo4j-contrib/neo4j-faker/releases | |
//unzip: place the contents of the "dist" directory in the "plugins" directory of your neo4j server | |
// add property: dbms.security.procedures.unrestricted=apoc.*,gds.*,fkr.* to neo4j.conf in the conf directory | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Persons using faker | |
foreach (i in range(1,5000) | | |
create (p:Person { id : i }) | |
set p += fkr.person('1940-01-01','2020-05-15') | |
set p.healthstatus = fkr.stringElement("Sick,Healthy") | |
set p.confirmedtime = datetime()-duration("P"+toInteger(round(rand()*100))+"DT"+toInteger(round(rand()*10))+"H") | |
set p.birthDate = datetime(p.birthDate) | |
set p.addresslocation = point({x: toFloat(51.210197+rand()/100), y: toFloat(4.402771+rand()/100)}) | |
set p.name = p.fullName | |
remove p.fullName | |
); | |
//Places using faker | |
foreach (i in range(1,100) | | |
create (p:Place { id: i, name: "Place nr "+i}) | |
set p.type = fkr.stringElement("Grocery shop,Theater,Restaurant,School,Hospital,Mall,Bar,Park") | |
set p.location = point({x: toFloat(51.210197+rand()/100), y: toFloat(4.402771+rand()/100)}) | |
); | |
create index on :Place(id); | |
create index on :Place(location); | |
create index on :Place(name); | |
create index on :Person(id); | |
create index on :Person(name); | |
create index on :Person(healthstatus); | |
create index on :Person(confirmedtime); | |
//VISITS using cypher | |
with range(1,5000) as range | |
unwind range as iteration | |
match (p:Person {id: toInteger(rand()*500)+1}), (pl:Place {id:toInteger(rand()*100)+1 }) | |
create (p)-[:PERFORMS_VISIT]->(v:Visit { id: iteration})-[:LOCATED_AT]->(pl) | |
create (p)-[virel:VISITS]->(pl) | |
set v.starttime = datetime()-duration("P"+toInteger(round(rand()*100))+"DT"+toInteger(round(rand()*10))+"H") | |
set virel.starttime = v.starttime | |
set v.endtime = v.starttime + duration("PT"+toInteger(round(rand()*10))+"H"+toInteger(round(rand()*60))+"M") | |
set virel.endtime = v.endtime; | |
//connect places to Region | |
create (r:Region {name:"Antwerp"})-[:PART_OF]->(c:Country {name:"Belgium"})-[:PART_OF]->(co:Continent {name:"Europe"}); | |
match (r:Region {name:"Antwerp"}), (pl:Place) | |
create (pl)-[:PART_OF]->(r); | |
//Find out which people actually MEET - adding a MEETS relationship | |
match (p1:Person)-[v1:VISITS]->(pl:Place)<-[v2:VISITS]-(p2:Person) | |
where id(p1)<id(p2) | |
with p1, p2, apoc.coll.max([v1.starttime.epochMillis, v2.starttime.epochMillis]) as maxStart, | |
apoc.coll.min([v1.endtime.epochMillis, v2.endtime.epochMillis]) as minEnd | |
where maxStart <= minEnd | |
with p1, p2, sum(minEnd-maxStart) as meetTime, maxStart as meetingstarttime | |
create (p1)-[m:MEETS {meetingstarttime: datetime({epochMillis: meetingstarttime}), meettime: duration({seconds: meetTime/1000})}]->(p2) | |
set m.meettimeinseconds=m.meettime.seconds; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Create 5000 Persons using faker | |
foreach (i in range(1,5000) | | |
create (p:Person { id : i }) | |
set p += fkr.person('1940-01-01','2020-05-15') | |
set p.healthstatus = fkr.stringElement("Sick,Healthy") | |
set p.confirmedtime = datetime()-duration("P"+toInteger(round(rand()*100))+"DT"+toInteger(round(rand()*10))+"H") | |
set p.birthDate = datetime(p.birthDate) | |
set p.addresslocation = point({x: toFloat(51.210197+rand()/100), y: toFloat(4.402771+rand()/100)}) | |
set p.name = p.fullName | |
remove p.fullName | |
); | |
//Create 15000 MEETS relationships using faker | |
match (p:Person) | |
with collect(p) as persons | |
call fkr.createRelations(persons, "MEETS" , persons, "1-n") yield relationships as meetsRelations1 | |
call fkr.createRelations(persons, "MEETS" , persons, "1-n") yield relationships as meetsRelations2 | |
call fkr.createRelations(persons, "MEETS" , persons, "1-n") yield relationships as meetsRelations3 | |
with meetsRelations1+meetsRelations2+meetsRelations3 as meetsRelations | |
unwind meetsRelations as meetsRelation | |
set meetsRelation.starttime = datetime()-duration("P"+toInteger(round(rand()*100))+"DT"+toInteger(round(rand()*10))+"H") | |
set meetsRelation.endtime = meetsRelation.starttime + duration("PT"+toInteger(round(rand()*10))+"H"+toInteger(round(rand()*60))+"M") | |
set meetsRelation.meettime = duration.between(meetsRelation.starttime,meetsRelation.endtime) | |
set meetsRelation.meettimeinseconds=meetsRelation.meettime.seconds; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment