Redis 正在逐步淘汰 RedisGraph. 这篇博文 解释了此决定的原因以及对现有 Redis 客户和社区成员的影响。
支持结束时间定于 2025 年 1 月 31 日。
RedisGraph 允许您使用 [Cypher 查询语言](https://opencypher.org/) 在 Redis 中存储和查询图数据。在本文中,我们将讨论 RedisGraph 与 .NET 的使用。
我们将使用 NRedisGraph 包在本教程中。要将包安装到您的项目中,请使用 dotnet add package NRedisGraph
.
在本地使用 RedisGraph 最简单的方法是使用 RedisGraph docker 镜像
docker run -p 6379:6379 redis/redis-stack-server:latest
上述命令将在本地启动一个 Redis 实例,并加载 RedisGraph 模块,您将能够在 localhost:6379 上连接到它。
NRedisGraph 使用 StackExchange.Redis 项目,该项目与 NRedisGraph
一起安装。要创建 RedisGraph
对象,您首先需要创建一个 ConnectionMultiplexer
,并从中获取对 IDatabase
对象的引用,然后使用 IDatabase
对象初始化 RedisGraph
。
var muxer = ConnectionMultiplexer.Connect("localhost");
var db = muxer.GetDatabase();
var graph = new RedisGraph(db);
RedisGraph 中的查询适用于各种操作,但从根本上说,当使用 NRedisGraph 执行查询时,您只需执行 graph.Query
或 graph.QueryAsync
,并传入要查询的图的名称和要运行的查询。例如,我们将使用本教程中剩余部分的图 pets
,pets
是图将存储的键的名称。因此,对 graph.Query
或 graph.QueryAsync
的任何调用都会首先传入 pets
,以指示要使用的图。
要在 RedisGraph 中创建节点,您将使用 Create 操作。让我们从创建两个人类 Alice 和 Bob 开始。
var createBobResult = await graph.QueryAsync("pets", "CREATE(:human{name:'Bob',age:32})");
await graph.QueryAsync("pets", "CREATE(:human{name:'Alice',age:30})");
对 RedisGraph 运行查询将产生一个 ResultSet
。此结果将包含有关查询结果的一些元数据,这些元数据位于 Statistics
部分,以及查询生成的任何结果。在本例中,仅返回查询的统计信息,您可以直接从结果对象中打印出来。
Console.WriteLine($"Nodes Created:{createBobResult.Statistics.NodesCreated}");
Console.WriteLine($"Properties Set:{createBobResult.Statistics.PropertiesSet}");
Console.WriteLine($"Labels Created:{createBobResult.Statistics.LabelsAdded}");
Console.WriteLine($"Operation took:{createBobResult.Statistics.QueryInternalExecutionTime}");
您可以通过简单地执行另一个 CREATE 语句来创建具有其他标签的节点。例如,如果我们想创建一个名为“Honey”的“宠物”,它是一只 5 岁的灰狗,我们将运行
await graph.QueryAsync("pets", "CREATE(:pet{name:'Honey',age:5,species:'canine',breed:'Greyhound'})");
与创建节点一样,您也可以使用 Query/QueryAsync 命令在 RedisGraph 中创建关系,以在 RedisGraph 中的节点之间建立关系。例如,要建立 Bob 和灰狗 Honey 之间的主人关系,您可以使用以下方法:
await graph.QueryAsync("pets",
"MATCH(a:human),(p:pet) WHERE(a.name='Bob' and p.name='Honey') CREATE (a)-[:OWNS]->(p)");
现在我们已经创建了一些节点以及节点之间的关系,我们可以使用 Query
和 QueryAsync
查询图中的内容。例如,如果我们想找到 Honey 的所有主人,我们将发出以下查询。
var matches = await graph.QueryAsync("pets", "MATCH(a:human),(p:pet) where (a)-[:OWNS]->(p) and p.name='Honey' return a");
然后我们可以遍历生成的匹配项,它与我们之前使用的 ResultSet
类相同,但它将包含我们可以访问的实际结果。
foreach (var match in matches)
{
Console.WriteLine(((Node) match.Values.First()).PropertyMap["name"].Value);
}
我们还可以找到 Honey 的所有步行者,方法是找到所有与 Honey 存在 WALKS
关系的人类:
matches = await graph.QueryAsync("pets", "MATCH(a:human),(p:pet) where (a)-[:WALKS]->(p) and p.name='Honey' return a");
然后,如果我们想找到 Bob 的所有狗,我们将查询图并找到所有与名为 Bob 的人类存在 OWNS 关系的犬类。
matches = await graph.QueryAsync("pets", "MATCH(a:human),(p:pet) where (a)-[:OWNS]->(p) and p.species='canine' and a.name='Bob' return p");