About me Frank Neff ■ Software Engineer @ YMC AG ■ Living in Zurich, Switzerland ■ Coding PHP and Java ■ Student ■ Open Source Enthusiast ■ UAV Drone Pilot ■ Hobby Photographer ■ frankneff.ch ■ ymc.ch
■ Users can be friends with other Users ■ Users can follow other Users ■ Users can write Posts ■ Users can like other Posts ■ Users can share other Posts Let’s build a social network
■ Graph model for data representation ■ Reliable, with full ACID transactions ■ Scalable, up to several billion nodes/relationships/properties ■ Cypher, a human readable query language ■ REST interface or Java API Features
PHP Wrapper for the Neo4j graph database REST interface everyman/neo4jphp ■ Written in PHP ■ Abstracts cURL requests behind a wrapper ■ Installation using GitHub / Composer ■ Easy to use ■ Implemented in many other projects ■ github.com/jadell/neo4jphp
// autoloading require('vendor/autoload.php'); // Connecting to the default port 7474 on localhost $client = new Everyman\Neo4j\Client(); // create a new node $arthur = $client->makeNode(); $arthur->setProperty('name', 'Frank') ->setProperty('title', 'Software Engineer') ->setProperty('company', 'YMC') ->save(); // get ID from Neo4j $arthurId = $arthur->getId();
Doctrine2-style entity mapper for Neo4j graph database hirevoice/neo4jphp-ogm ■ Written in PHP ■ Provides entity mapping using annotations ■ Installation using GitHub / Composer ■ Similar to Doctrine ORM ■ Implements doctrine/common ■ github.com/lphuberdeau/Neo4j-PHP-OGM
■ Entity ■ Auto ■ Porperty ■ Index ■ ManyToOne ■ ManyToMany use HireVoice\Neo4j\Annotation as OGM; class MyEntity { /** * @OGM\Property(format="date") */ protected $releaseDate; } Available annotations
■ Entity ■ Auto ■ Porperty ■ Index ■ ManyToOne ■ ManyToMany use HireVoice\Neo4j\Annotation as OGM; class MyEntity { /** * @OGM\Property * @OGM\Index */ protected $name; } Available annotations
■ Entity ■ Auto ■ Porperty ■ Index ■ ManyToOne ■ ManyToMany use HireVoice\Neo4j\Annotation as OGM; class MyEntity { /** * @OGM\ManyToOne(relation="acts-in") */ protected $mainActor; } Available annotations
$em = // Let's assume the entity manager is initialized in $em $repository = $em->getRepository('Entity\\User'); // Find a User by a specific field $user = $repository->findOneByFullName('superman'); // Returns a User object // Find some users by a specific field $usersFromFrance = $repository->findByCountry('FR'); // Returns a collection // Find one User with more than one criteria $nonActiveWithSuchEmail = $repository->findOneBy(array( 'status' => 'idle', 'email' => '[email protected]') ); // Returns a collection
use HireVoice\Neo4j\Event as Events; class PrePersistListener { public function prePersist(Events\PrePersist $event) { $entity = $event->getEntity(); // do your stuff here... } } Create event listener
use \Doctrine\Common\EventManager; $eventManager = new EventManager(); $listener = new PrePersistListener(); $eventManager->addEventListener( array('prePersist'), // array of all listened events $listener // instance of your event listener ); $entityManager->setEventManager($eventManager); Create event manager
■ prePersist - Fires before an entity is persisted ■ postPersist - Fires after an entity is persisted ■ preRelationCreate - Fires before a relation is created ■ postRelationCreate - Fires after a relation is created ■ preStmtExecute - Fires before a statement (query) is executed ■ postStmtExecute - Fires after a statement (query) is executed ■ preRemove - Fires before an entity is removed ■ postRemove - Fires after an entity is removed ■ preRelationRemove - Fires before a relation is removed ■ postRelationRemove - Fires after a relation is removed Available events
■ Not recommended for large datasets ○ Streaming not supported ○ Memory exhaustion ■ Not feature complete yet ○ Graph traversals ○ Relation properties ■ Small community / few maintainers OGM drawbacks
■ Neo4j ○ ...is the most common graph database ○ fast ○ actively maintained ○ big community ■ PHP ○ ...is the most common scripting language for the web ○ widely used ○ big community ○ other great persistence libs in PHP to learn from Neo4j and PHP