欢迎来到“从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.py
)
https://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"
您应该看到这样的图(请记住检查“所有关系”标志:
真的没有帮助,对吗? ð
好吧,有信息,现在您必须查询您想知道的内容。
一点背景:
几年前,一家公司要求我解决作为后端开发人员采访的测试。我有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
中使用一个(或更多)先前匹配的节点时,此关键字很有用。
allShortestPaths
是MATCH
的函数,它使我们能够找到两个节点之间的每个最短路径。如果我们选择将结果视为文本(而不是Defaul图),我们可以看到Redis找到了2个路径:
如果我们只想要最短的路径,我们可以使用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
我希望您遵循了这个系列,并像我一样喜欢它!