everyman/neo4jphp
Neo4jPHP is a PHP wrapper for the Neo4j graph database REST API. Connect to a Neo4j server, inspect server info, and work with graph data and Cypher queries via a simple client. Installable via Composer.
Installation:
composer require everyman/neo4jphp:dev-master
Ensure vendor/autoload.php is included in your project.
Basic Connection:
$client = new Everyman\Neo4j\Client('localhost', 7474, 'username', 'password');
$serverInfo = $client->getServerInfo();
Verify connectivity by inspecting $serverInfo.
First Use Case: Create a node and query it:
$node = $client->createNode();
$node->setProperty('name', 'Test Node');
$node->save();
$result = $client->query("MATCH (n) WHERE n.name = 'Test Node' RETURN n");
$nodes = $result->getNodes();
save(), delete(), load()).query() method.createIndex(), dropIndex()).Create/Update:
$node = $client->createNode();
$node->setProperty('title', 'Laravel Developer');
$node->setProperty('skills', ['PHP', 'GraphDB']);
$node->save(); // Auto-generates ID
Read:
$node = $client->loadNode($nodeId);
$skills = $node->getProperty('skills'); // Returns array
Delete:
$node->delete();
$node1 = $client->loadNode($id1);
$node2 = $client->loadNode($id2);
$rel = $node1->createRelationship($node2, 'KNOWS');
$rel->setProperty('since', 2020);
$rel->save();
$batch = $client->openBatch();
$batch->createNode()->setProperty('batch_item', true)->save();
$batch->close();
$result = $client->query(
"MATCH (n:User)-[:FOLLOWS]->(m:User) RETURN n.name, m.name",
['params' => ['userId' => $userId]]
);
$rows = $result->getRows(); // Array of results
$client->createIndex('users', 'name'); // Full-text index
$client->dropIndex('users', 'name');
Service Provider:
Bind the client to Laravel’s container in AppServiceProvider:
public function register()
{
$this->app->singleton('neo4j', function () {
return new Everyman\Neo4j\Client(config('neo4j.host'), config('neo4j.port'));
});
}
Eloquent-like Usage: Create a repository pattern for nodes:
class UserRepository {
protected $client;
public function __construct(Everyman\Neo4j\Client $client) {
$this->client = $client;
}
public function findByName($name) {
$result = $this->client->query("MATCH (n:User {name: \$name}) RETURN n", ['name' => $name]);
return $result->getNodes();
}
}
Query Builder:
Extend the package to support Laravel’s query builder syntax (e.g., Node::where('name', 'John')->get()).
Authentication:
$client = new Everyman\Neo4j\Client('localhost', 7474, 'user', 'pass', true);
Cypher vs. Gremlin:
Transactions:
$batch = $client->openBatch();
try {
$batch->createNode()->setProperty('data', 'critical')->save();
$batch->close();
} catch (\Exception $e) {
$batch->rollback(); // Not natively supported; handle manually
}
Caching:
EntityCache plugin. Enable it for performance:
$client->setCache(new Everyman\Neo4j\Cache\EntityCache());
delete()).Property Handling:
null deletes it:
$node->setProperty('temp', null); // Removes 'temp' entirely
unsetProperty() explicitly for clarity.Error Handling:
try {
$client->query("MATCH (n) DELETE n"); // Dangerous!
} catch (Everyman\Neo4j\Exception $e) {
Log::error($e->getMessage());
}
Everyman\Neo4j\Exception\ConnectionException: Network issues.Everyman\Neo4j\Exception\QueryException: Invalid Cypher/Gremlin.Large Datasets:
$result = $client->query("MATCH (n) RETURN n SKIP 0 LIMIT 100");
Enable Logging: Configure the client to log raw HTTP requests:
$client->setLogger(new Everyman\Neo4j\Logger\FileLogger('/path/to/neo4j.log'));
Check Server Info:
$serverInfo = $client->getServerInfo();
// Verify 'cypher' or 'gremlin' plugins are enabled.
Validate Cypher: Test queries in Neo4j Browser first.
Transport Issues:
allow_self_signed is set:
$client = new Everyman\Neo4j\Client('localhost', 7474, null, null, true, true);
Custom Transport:
Extend Everyman\Neo4j\Transport\TransportInterface for custom HTTP clients (e.g., Guzzle).
Plugins: Add caching or logging plugins:
$client->addPlugin(new Everyman\Neo4j\Plugin\MyCustomPlugin());
Query Builder: Create a Laravel-like facade:
class Neo4j {
public static function query($cypher) {
return app('neo4j')->query($cypher);
}
}
Event Listeners: Listen for node/relationship changes (e.g., trigger Laravel events):
$node->on('save', function () {
event(new NodeSaved($node));
});
7474 (not 7687 for Bolt).exact, fulltext, and range indexes. Ensure your Neo4j version matches the expected syntax.snake_case for properties).How can I help you explore Laravel packages today?