Square ¡Pegs ¡and ¡Round ¡Holes ¡in ¡ the ¡NOSQL ¡World ¡ Jim ¡Webber ¡ Chief ¡Scien?st, ¡Neo ¡Technology ¡ @jimwebber ¡
A ¡rapid ¡talk ¡about ¡Neo4j ¡ (and ¡rants ¡on ¡other ¡stuff) ¡ Jim ¡Webber ¡ Chief ¡Scien?st, ¡Neo ¡Technology ¡ @jimwebber ¡
hMp://slantmagazine.com/film/review/saturday-‑night-‑fever/4210 ¡
hMp://freenewfoundlandlabrador.blogspot.com/2011/07/nl-‑fisheries-‑500-‑years-‑of-‑turmoil.html ¡
hMp://www.oopsla.org/oopsla2008/support ¡
hMp://uncyclopedia.wikia.com/wiki/File:Square-‑earth.jpg ¡
hMp://www.telegraph.co.uk/finance/newsbysector/industry/8470355/The-‑fall-‑and-‑rise-‑of-‑the-‑Bri?sh-‑car-‑industry-‑?meline.html ¡
Bomb ¡the ¡argies! ¡ Crush ¡the ¡miners ! ¡ Defy ¡Europe! ¡ I’m ¡CEO, ¡bitch! ¡ hMp://www.answers.com/topic/margaret-‑thatcher-‑large-‑image-‑3 ¡
hMp://www.themoviedb.org/movie/26305 ¡
hMp://iremedy.net/blog/2010/05/your-‑office-‑without-‑boundaries/ ¡
Share ¡everything! ¡ Social ¡graph! ¡ ¡ I’m ¡CEO, ¡bitch! ¡
hMp://morganlinton.com/why-‑there-‑is-‑no-‑one-‑size-‑fits-‑all-‑development-‑solu?on/ ¡
hMp://www.flickr.com/photos/crazyneighborlady/355232758/ ¡
hMp://gallery.nen.gov.uk/image82582-‑.html ¡
hMp://www.xtranormal.com/watch/6995033/mongo-‑db-‑is-‑web-‑scale ¡
hMp://www.orangesmile.com/des?na?ons/img/berlin-‑map-‑metro-‑big.gif ¡
Neo4j: ¡Crea?ng ¡Nodes ¡ GraphDatabaseService db = new EmbeddedGraphDatabase( "/tmp/neo"); Transaction tx = db.beginTx(); try { Node theDoctor = db.createNode(); theDoctor.setProperty("name", "the Doctor"); tx.success(); } finally { tx.finish(); }
Neo4j: ¡Crea?ng ¡Rela?onships ¡ Transaction tx = db.beginTx(); try { Node theDoctor = db.createNode(); theDoctor.setProperty("name", "The Doctor"); Node susan = db.createNode(); susan.setProperty("firstname", "Susan"); susan.setProperty("lastname", "Campbell"); susan.createRelationshipTo(theDoctor, DynamicRelationshipType.withName("COMPANION_OF")); tx.success(); } finally { tx.finish(); }
hMp://malden-‑dsme.co.uk/public/hcj.html ¡
hMp://easystreetdiscount.auc?vacommerce.com/Nirvana-‑Smiley-‑Face-‑Music-‑Band-‑Decal-‑S?cker-‑P188162.aspx ¡
hMp://www.tolkienlibrary.com/press/922-‑Isildur_Poker_Champion.php ¡
hMp://www.vaccine?mes.com/wp-‑content/uploads/2010/12/microscope.jpg ¡
username: Jeff1986 username: SallyDJ username: FunkySam username: Gazza age: 25 age: 28 age: 24 age: 32 friend : SallyDJ friend : Jeff1986 friend : SallyDJ friend : Jeff1986 friend : Gazza friend: FunkySam Document ¡Database ¡
username: SallyDJ age: 28 username: Jeff1986 username: FunkySam username: Gazza age: 25 age: 24 age: 32 Applica?on ¡Layer ¡ Reify ¡ username: Jeff1986 username: SallyDJ username: FunkySam username: Gazza age: 25 age: 28 age: 24 age: 32 friend : SallyDJ friend : Jeff1986 friend : SallyDJ friend : Jeff1986 friend : Gazza friend: FunkySam Document ¡Database ¡
username: SallyDJ age: 28 FRIEND FRIEND FRIEND username: Jeff1986 username: FunkySam username: Gazza age: 25 age: 24 age: 32 Graph ¡Database ¡
hMp://www.freewebs.com/fic?onfrek101/han.jpg ¡
username: Gazza username: SallyDJ age: 32 age: 28 PURCHASED PURCHASED D E S A H C R U P product: SuperCans product: CoolDecks manufacturer : Acme manufacturer : Acme price : 150 price : 599 Graph ¡Database ¡ username: SallyDJ username: Gazza age: 28 age: 32 purchased : product: SuperCans product: CoolDecks purchased : CoolDecks SuperCans manufacturer : Acme manufacturer : Acme purchased : price : 150 price : 599 SuperCans Document ¡Database ¡
hMp://xkcd.com/653/ ¡
FRIEND username: Jeff1986 username: FunkySam username: Gazza age: 25 age: 24 age: 32 FRIEND D N E I R F PURCHASED username: SallyDJ age: 28 D E PURCHASED S A H C R U P product: SuperCans product: CoolDecks manufacturer : Acme manufacturer : Acme price : 150 price : 599 Graph ¡Database ¡
hMp://void.iddqd.cz/comic-‑book-‑guy-‑pc.jpg ¡
stole ¡ companion ¡ loves ¡ from ¡ appeared ¡ ¡ loves ¡ enemy ¡ in ¡ companion ¡ appeared ¡ ¡ in ¡ appeared ¡ ¡ enemy ¡ in ¡ enemy ¡ appeared ¡ ¡ appeared ¡ ¡ in ¡ A ¡Good ¡Man ¡ in ¡ Goes ¡to ¡War ¡ Victory ¡of ¡ ¡ the ¡Daleks ¡ appeared ¡ ¡ in ¡
Graph ¡Algorithms ¡ What’s ¡the ¡shortest ¡path ¡between ¡the ¡Doctor ¡and ¡the ¡Master? ¡ Node theMaster = … Node theDoctor = … int maxDepth = 5; PathFinder<Path> shortestPathFinder = GraphAlgoFactory. shortestPath( Traversal.expanderForAllTypes(), maxDepth); Path shortestPath = shortestPathFinder.findSinglePath(theDoctor, theMaster);
Path ¡finding ¡ Find ¡ all ¡the ¡episodes ¡where ¡Rose ¡Tyler ¡fought ¡the ¡Daleks ¡
Path ¡finder ¡code ¡ algo ¡ Node rose = ... Node daleks = ... PathFinder<Path> pathFinder = GraphAlgoFactory.pathsWithLength( Traversal.expanderForTypes( constraints ¡ DoctorWhoUniverse.APPEARED_IN, Direction.BOTH), 2); fixed ¡path ¡length ¡ Iterable<Path> paths = pathFinder.findAllPaths(rose, daleks);
!PURCHASED product: CoolDecks age: < 40 manufacturer : Acme PURCHASED product: SuperCans manufacturer : Acme FRIEND username: Gazza username: Jeff1986 username: FunkySam age: 32 age: 25 age: 24 FRIEND FRIEND PURCHASED username: SallyDJ age: 28 E D P S U H A R C C U R H P A S E D product: SuperCans product: CoolDecks manufacturer : Acme manufacturer : Acme price : 150 price : 599 Graph&Database&
Why ¡graph ¡matching? ¡ • It’s ¡super-‑powerful ¡for ¡looking ¡for ¡paMerns ¡in ¡ a ¡data ¡set ¡ – Retail ¡analy?cs ¡ – Real-‑?me ¡upselling ¡ • Higher-‑level ¡abstrac?on ¡than ¡raw ¡traversers ¡ – Uses ¡ PatternNode ¡and ¡ PatternRelationship ¡types ¡to ¡describe ¡ graph ¡paMerns ¡ – The ¡“unbound” ¡parts ¡of ¡the ¡graph ¡
In ¡which ¡episodes ¡did ¡the ¡Doctor ¡ baMle ¡the ¡Cybermen? ¡
Seong ¡up ¡and ¡matching ¡a ¡paMern ¡ final PatternNode theDoctor = new PatternNode(); theDoctor.setAssociation( universe.theDoctor()); final PatternNode anEpisode = new PatternNode(); anEpisode.addPropertyConstraint("title", CommonValueMatchers. has()); anEpisode.addPropertyConstraint("episode", CommonValueMatchers. has()); final PatternNode aDoctorActor = new PatternNode(); aDoctorActor.createRelationshipTo(theDoctor, DoctorWhoUniverse. PLAYED); aDoctorActor.createRelationshipTo(anEpisode, DoctorWhoUniverse. APPEARED_IN); aDoctorActor.addPropertyConstraint("actor", CommonValueMatchers. has()); final PatternNode theCybermen = new PatternNode(); theCybermen.setAssociation( universe.speciesIndex.get("species", "Cyberman").getSingle()); theCybermen.createRelationshipTo(anEpisode, DoctorWhoUniverse. APPEARED_IN); theCybermen.createRelationshipTo(theDoctor, DoctorWhoUniverse. ENEMY_OF); PatternMatcher matcher = PatternMatcher. getMatcher(); final Iterable<PatternMatch> matches = matcher.match(theDoctor, universe.theDoctor());
HIPSTER ¡DEVS, ¡Y ¡U ¡NO ¡LIKE ¡JAVA? ¡
Equivalent ¡Cypher ¡Query ¡ start doctor=(Characters,name,"Doctor"), cybermen=(Species,species,"Cyberman") match (doctor)<-[:PLAYED]-(actor) -[:APPEARED_IN]->(ep) <-[:APPEARED_IN]-(cybermen) where ep.title and ep.episode return ep.title, actor.actor
Cold ¡cache! ¡
hMp://male-‑ejacula?on.net/ ¡
hMp://www.561studios.com/blog/wp-‑content/uploads/2010/07/commonsense.jpg ¡
Hands-‑on ¡tutorial ¡tomorrow! ¡ Sign ¡up ¡with ¡the ¡ ¡conference ¡organisers ¡
Thanks ¡for ¡listening ¡ Community: ¡ h1p://neo4j.org ¡ Koans: ¡ h1ps://github.com/jimwebber/neo4j-‑tutorial ¡ Me: ¡ @jimwebber ¡
Recommend
More recommend