mkorkmaz / redislabs-redisgraph-php
Redislabs Redis Graph 模块的 PHP 客户端。
1.2
2022-12-10 20:51 UTC
Requires
- php: ^8.0
- mkorkmaz/redislabs-common: ^1.1
- sevenecks/tableify: ^0.0.5
Requires (Dev)
- ext-redis: *
- codeception/codeception: ^5.0.5
- codeception/module-asserts: ^3.0.0
- damianopetrungaro/php-commitizen: ^0.2.0
- malukenho/mcbumpface: ^1.1.5
- php-coveralls/php-coveralls: ^v2.5.3
- predis/predis: ^v2.0.3
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.7.1
- vimeo/psalm: ^5.1.0
Suggests
- ext-redis: If your application depends of redis PCEL extention.
- mper/cypher-querybuilder: A php query builder for cypher queries.
- predis/predis: If your application depends on predis.
README
RedisGraph-PHP 提供了 Redislabs RedisGraph 模块的 PHP 客户端。此库支持广泛使用的 Redis 客户端(PECL Redis 扩展 和 Predis)。
重要
在使用此库之前,请阅读此公告的详细信息: RedisGraph 生命终结公告
关于 RedisGraph
"RedisGraph 是第一个使用稀疏矩阵表示图中的邻接矩阵并使用线性代数查询图的可查询属性图数据库。"
RedisGraph-PHP 接口
您可以使用这些函数运行任何 RedisGraph 查询命令。
<?php use Redislabs\Module\RedisGraph\Interfaces\QueryInterface; use Redislabs\Module\RedisGraph\Result; interface RedisGraph { public function rawQuery(QueryInterface $query) : array public function query(QueryInterface $query) : Result public function delete(string $name) : string; public function explain(QueryInterface $query) : string; public function commit(QueryInterface $query) : Result }
安装
安装 RedisGraph-PHP 的推荐方法是使用 composer。
composer require mkorkmaz/redislabs-redisgraph-php
使用方法
要使用 RedisGraph-PHP,您需要 PECL Redis 扩展或 Predis。
创建 RedisGraph 客户端
PECL Redis 扩展的示例
<?php declare(strict_types=1); use Redis; use Redislabs\Module\RedisGraph\RedisGraph; $redisClient = new Redis(); $redisClient->connect('127.0.0.1'); $redisGraph = RedisGraph::createWithPhpRedis($redisClient);
Predis 的示例
<?php declare(strict_types=1); use Predis; use Redislabs\Module\RedisGraph\RedisGraph; $redisClient = new Predis\Client(); $redisGraph = RedisGraph::createWithPredis($redisClient);
构建一个图。
<?php use Redislabs\Module\RedisGraph\Node; use Redislabs\Module\RedisGraph\Edge; use Redislabs\Module\RedisGraph\GraphConstructor; $labelSource = 'person'; $labelDestination = 'country'; $propertiesSource = ['name' => 'John Doe', 'age' => 33, 'gender' => 'male', 'status' => 'single']; $propertiesDestination = ['name' => 'Japan']; $edgeProperties = ['purpose' => 'pleasure', 'duration' => 'two weeks']; $person = Node::createWithLabel($labelSource) ->withProperties($propertiesSource) ->withAlias('CatOwner'); $country = Node::createWithLabelAndProperties($labelDestination, $propertiesDestination) ->withAlias('CatCountry'); $edge = Edge::create($person, 'visited', $country) ->withProperties($edgeProperties); $graph = new GraphConstructor('TRAVELLERS'); $graph->addNode($person); $graph->addNode($country); $graph->addEdge($edge); $commitQuery = $graph->getCommitQuery(); $result = $redisGraph->commit($commitQuery); var_dump($result->getLabelsAdded()); // int(2) var_dump($result->getNodesCreated()); // int(2) var_dump($result->getLabelsAdded()); // int(2) var_dump($result->getNodesDeleted()); // int(0) var_dump($result->getRelationshipsCreated()); // int(1) var_dump($result->getRelationshipsDeleted()); // int(0) var_dump($result->getPropertiesSet()); // int(7) var_dump($result->getExecutionTime()); // float(0.9785) $propertiesSource = ['name' => 'Jane Doe', 'age' => 30, 'gender' => 'female', 'status' => 'single']; $propertiesDestination = ['name' => 'Japan']; $edgeProperties = ['purpose' => 'pleasure', 'duration' => 'one weeks']; $person2 = Node::createWithLabel($labelSource)->withProperties($propertiesSource); $country2 = Node::createWithLabelAndProperties($labelDestination, $propertiesDestination); $edge2 = Edge::merge($person2, 'visited', $country2)->withProperties($edgeProperties); $propertiesSource = ['name' => 'Kedibey', 'age' => 13, 'gender' => 'male', 'status' => 'single']; $propertiesDestination = ['name' => 'Turkey']; $edgeProperties = ['purpose' => 'living', 'duration' => 'whole life']; $person3 = Node::createWithLabel($labelSource)->withProperties($propertiesSource); $country3 = Node::createWithLabelAndProperties($labelDestination, $propertiesDestination); $edge3 = Edge::merge($person3, 'visited', $country3)->withProperties($edgeProperties); $graph = new GraphConstructor('TRAVELLERS'); $graph->addNode($person2); $graph->addNode($country2); $graph->addEdge($edge2); $graph->addNode($person3); $graph->addNode($country3); $graph->addEdge($edge3); $commitQuery = $graph->getCommitQueryWithMerge(); $this->redisGraph->commit($commitQuery);
查询一个图。
use Redislabs\Module\RedisGraph\Query; $matchQueryString = 'MATCH (p:person)-[v:visited {purpose:"pleasure"}]->(c:country) RETURN p.name, p.age, v.purpose, v.duration, c.name'; $matchQuery = new Query('TRAVELLERS', $matchQueryString); $result = $redisGraph->query($matchQuery); $labels = $result->getLabels(); $resultSet = $result->getResultSet(); var_dump($labels); // Dumps column labels var_dump($resultSet[0]); // Dumps first result ... $result->prettyPrint(); /* Prints ------------------------------------------------------ | p.name | p.age | v.purpose | v.duration | c.name | ------------------------------------------------------ | John Doe | 33 | pleasure | two weeks | Japan | | Jane Doe | 30 | pleasure | one weeks | Japan | ------------------------------------------------------ */
Cypher 查询构建器
此库不提供查询构建器,但您可以使用 mper/cypher-querybuilder
1. 安装库。
composer require mper/cypher-querybuilder
2. 然后构建您的查询
<?php use MP\Cypher\QueryBuilder; $queryBuilder = new QueryBuilder(); $queryBuilder->addMatch() ->addNode('p', 'person') ->relation('v', 'visited', ['purpose' => 'pleasure'])->right() ->node('c', 'country'); $matchQueryString = $queryBuilder->getQuery('p.name', 'p.age', 'v.purpose', 'c.name'); echo $matchQueryString; // Prints "MATCH (p:person)-[v:visited {purpose:'pleasure'}]->(c:country) RETURN p.name,p.age,v.purpose,c.name"
测试和开发
您可以使用 Redislabs 提供的 Docker 镜像。
docker run -p 6379:6379 --name redis-redisgraph redislabs/redisgraph:latest