如何使用PHP操作Neo4j数据库实现数据建模及增删改查
1 等效关系型表的结构实现
Neo4j为无模式图数据库,没有关系型数据库中“表”的严格定义,与MySQL中users_table对应的是带User标签的节点集合,你可以通过创建约束和索引实现与MySQL建表语句等效的主键、字段校验、唯一值限制能力:
// 初始化用户id自增计数器(仅需执行1次,等效auto_increment) $client->run('MERGE (c:Counter {name: "user_id"}) ON CREATE SET c.value = 0'); // 创建id字段唯一约束,等效MySQL的primary key $client->run('CREATE CONSTRAINT user_id_unique IF NOT EXISTS FOR (u:User) REQUIRE u.id IS UNIQUE'); // 创建email字段唯一约束,避免重复注册 $client->run('CREATE CONSTRAINT user_email_unique IF NOT EXISTS FOR (u:User) REQUIRE u.email IS UNIQUE'); // 可选:创建字段非空、类型校验约束(Neo4j 4.4及以上版本支持) $client->run('CREATE CONSTRAINT user_fullname_notnull IF NOT EXISTS FOR (u:User) REQUIRE u.fullname IS NOT NULL'); $client->run('CREATE CONSTRAINT user_email_type IF NOT EXISTS FOR (u:User) REQUIRE u.email IS :: STRING');
2 增删改查操作等效实现
neo4j-php-client支持原生参数绑定,用法与PDO高度相似,以下是对应操作的实现示例:
2.1 插入操作
$cypher = <<<'CYPHER' MATCH (c:Counter {name: "user_id"}) SET c.value = c.value + 1 CREATE (u:User { id: c.value, password: $password, fullname: $fullname, email: $email }) CYPHER; $client->run($cypher, [ 'password' => 'my pass', 'fullname' => 'Nkem C', 'email' => 'testing@gmail.com' ]);
2.2 更新操作
$cypher = <<<'CYPHER' MATCH (u:User {email: $email}) SET u.password = $password, u.fullname = $fullname CYPHER; $client->run($cypher, [ 'password' => 'my pass1', 'fullname' => 'Nkem C1', 'email' => 'testing@gmail.com' ]);
2.3 删除操作
// 按email删除指定用户 $cypher = <<<'CYPHER' MATCH (u:User {email: $email}) DELETE u CYPHER; $client->run($cypher, ['email' => 'testing@gmail.com']); // 删除所有User节点(等效DELETE FROM users_table) // 若节点关联了其他关系,需将DELETE改为DETACH DELETE同时删除关联关系 $client->run('MATCH (u:User) DELETE u');
2.4 查询操作
// 按邮箱和密码查询指定用户 $cypher = <<<'CYPHER' MATCH (u:User {email: $email, password: $password}) RETURN u.id AS id, u.fullname AS fullname, u.email AS email CYPHER; $result = $client->run($cypher, [ 'email' => 'testing@gmail.com', 'password' => 'my pass' ]); if ($result->count() > 0) { $user = $result->first(); $id = $user->get('id'); $fullname = $user->get('fullname'); } // 查询所有用户(等效SELECT * FROM users_table) $result = $client->run('MATCH (u:User) RETURN u.id AS id, u.fullname AS fullname, u.email AS email'); foreach ($result as $record) { $id = $record->get('id'); $fullname = $record->get('fullname'); // 处理单条用户数据 }
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

