mkorkmaz/redislabs-redisgraph-php

Redislabs Redis Graph 模块的 PHP 客户端。

1.2 2022-12-10 20:51 UTC

This package is auto-updated.

Last update: 2024-09-09 20:13:19 UTC


README

RedisGraph-PHP 提供了 Redislabs RedisGraph 模块的 PHP 客户端。此库支持广泛使用的 Redis 客户端(PECL Redis 扩展Predis)。

Build Status Coverage Status Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

重要

在使用此库之前,请阅读此公告的详细信息: RedisGraph 生命终结公告

关于 RedisGraph

"RedisGraph 是第一个使用稀疏矩阵表示图中的邻接矩阵并使用线性代数查询图的可查询属性图数据库。"

关于 Redis Graph 的更多信息.

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