开始使用Cypher和Redisgraph /第三部分
#redis #cypher #graph #redisgraph

欢迎来到“从Cypher and Redisgraph”系列的最后一部分。
在第一篇文章中,我们查看了什么是图形db,为什么要使用一个图。第二篇文章解释了查询重新绘制的基础知识。

现在,我们将构建一个非常小的示例,以显示我们在上一篇文章中学到的一切。

首先,使用docker compose up -d启动Redis Insight。

此时,您需要在本地计算机上安装python3;如果您不这样做,请在线检查您的操作系统说明 您还需要点击和Redis Python扩展;您可以安装它们:

pip3 install click redis

现在您拥有一切,可以克隆演示存储库

git clone https://github.com/gfabrizi/redisgraph-demo.git

输入克隆目录并启动数据导入:

python3 bulk_insert.py Routes -n City.csv -r ROUTE.csv -h 127.0.0.1 -p 6379

您应该看到这样的消息:

b'City'  [####################################]  100%
19 nodes created with label 'b'City''
b'ROUTE'  [####################################]  100%
81 relations created for type 'b'ROUTE''
Construction of graph 'Routes' complete: 19 nodes created, 81 relations created in 0.006071 seconds

刚刚发生了什么?

我们从很棒的存储库redis-dataset
中使用了脚本(bulk_insert.pyhttps://github.com/redis-developer/redis-datasets
该脚本用于导入节点(-n参数)和关系(-r参数)。您可以指定多个节点和关系文件。
我们进口代表城市(City.csv)和关系(ROUTE.csv)的节点;导入脚本使用CSV文件名来为节点和关系命名。
因此,现在我们有了填充19个城市和1786条路线的图形“路线”。

是时候在浏览器中打开RedisinSight UI并开始查询!

可视化数据

转到Redisinsight中的“ WorkBench”选项卡,然后启动通用查询以显示所有节点和关系:

GRAPH.QUERY Routes "MATCH (a) RETURN a"

您应该看到这样的图(请记住检查“所有关系”标志:

Showing all nodes and edges

真的没有帮助,对吗? ð
好吧,有信息,现在您必须查询您想知道的内容。

一点背景:
几年前,一家公司要求我解决作为后端开发人员采访的测试。我有3-4天可以解决这个问题:“想象您有20个商品仓库,通过货车路线连接(每个仓库都与附近最多3个仓库相连)。写一个脚本,给定存款A和存款B-发现它们之间的最佳路线”。
我在这项测试中挣扎了几天,试图学习和实施Dijkstra算法……根本没有成功! ð¥²
好吧,如果我当时知道GraphDB,我将通过该测试! ð

例如,如果您想知道孟菲斯和凤凰城之间的最短路线,则可以使用此查询:

GRAPH.QUERY Routes "MATCH (source:City {name: 'Memphis'}), (destination:City {name: 'Phoenix'}) with source, destination MATCH p=allShortestPaths((source)-[:ROUTE*]->(destination)) RETURN nodes(p) as cities"

我们写了第一个MATCH查询,跟随第二个查询。要使用第二个MATCH的匹配节点,我们需要使用with关键字来指定它们。当您必须在以下MATCH中使用一个(或更多)先前匹配的节点时,此关键字很有用。
allShortestPathsMATCH的函数,它使我们能够找到两个节点之间的每个最短路径。如果我们选择将结果视为文本(而不是Defaul图),我们可以看到Redis找到了2个路径:

allShortestPaths match

如果我们只想要最短的路径,我们可以使用shortestPath函数:

GRAPH.QUERY Routes "MATCH (source:City {name: 'Memphis'}), (destination:City {name: 'Phoenix'}) RETURN shortestPath((source)-[:ROUTE*]->(destination))"

如果您查看结果的文本输出,您会注意到,这次重新编号不仅返回节点,而且还返回了节点之间的关系。
如果您只希望涉及shortestPath中的节点,请更改这样的查询:

GRAPH.QUERY Routes "MATCH (source:City {name: 'Memphis'}), (destination:City {name: 'Phoenix'}) RETURN nodes(shortestPath((source)-[:ROUTE*]->(destination)))"

很酷,对吗?

结论

本系列显示了重新绘制的基础和Cypher语言。
还有很多要探索和学习的东西。如果我们仅查看“路径算法”,则官方文档提供了许多可以使用的功能:
https://redis.io/docs/stack/graph/path_algorithm/#find-all-paths-from-a-if-the-trip-is-limited-to-10-kilometers

我希望您遵循了这个系列,并像我一样喜欢它!