在本系列的第一篇文章中,我们查看了什么是图DB,为什么要使用一个。
今天,我们将了解什么是Cypher开始查询图!
什么是Cypher
Cypher这是一种声明性查询语言,自2011年以来由Neo4J内部开发。
有一个正在进行的标准化过程(OpencyPher)使Cypher成为开放标准。
Cypher让您轻松地从图中检索数据。这是学习最简单的查询语言之一;它的语法以有助于可视化节点之间的关系的方式构建
重新印象
我们将在Redisinsight中运行查询。如果您阅读了本系列的上一篇文章,则应该知道如何运行Redis的基于Docker的安装。
启动docker compose up -d
后,将浏览器指向http://localhost:8001,重新介绍应该欢迎您。接受EULA,您将被重定向到Redisinsight仪表板。
接下来单击“ WorkBench”选项卡(左侧菜单中的第三个图标)。
这个新屏幕的右上窗格是您写所有查询的地方。
添加节点和边缘
现在,redis和redisinsight都在启动和运行,让我们创建一个新的图表并在其中添加一个节点:
GRAPH.QUERY Social "CREATE (:Person {name: 'Laura Phillips', age: 32})"
每个查询都由GRAPH.QUERY
和图形名称培养。
现在单击右侧的绿色箭头或按Ctrl + Enter
。
输出应与此相似:
第一次在不存在的图中创建e节点时,redisgraph将为我们创建图形。
因此,我们刚刚创建了一个名为“ Social”的新图,并添加了一个类型的“人”节点。
name
和age
是我们添加到节点的属性。 REDISGRAP自动将另一个属性添加到每个节点:唯一的id
。
我们可以批量添加更多节点:
GRAPH.QUERY Social "CREATE (:Person {name: 'Diana Hendrickson', age: 31}), (:Person {name: 'Susan Hendrickson', age: 29}), (:Person {name: 'Peter Steinmetz', age: 30}), (:Person {name: 'Louise Rosol', age: 29}), (:Person {name: 'Bryce Fett', age: 30})"
现在,图中应该有6个类型的Person
节点。让我们检查一下!
基本查询
GRAPH.QUERY Social "MATCH (p:Person) RETURN p"
让我们分析此查询:MATCH
是描述查询实体之间关系的关键字。它用于根据某些参数来“匹配”图中的某些内容。在这种情况下,我们要求Person
,我们使用p
来使结果别名(别名名称并不重要,您可以选择任何字母或单词)。
节点总是在圆括号中指定。
RETURN
关键字返回每个发现的每个p
。
因此,此查询返回它在图中找到的每个Person
。
结果图应该是这样的:
上一个查询也可以写为:
GRAPH.QUERY Social "MATCH (a) RETURN a"
这是查看图中所有节点的通用方法,您会看到这是很多次。在这里,我们使用的是a
而不要求特定的节点类型。
好吧,假设我们想找回那些恰好30岁的所有人:
GRAPH.QUERY Social "MATCH (p:Person {age: 30}) RETURN p"
此查询介绍了另一个功能:Node属性的匹配。在这里,我们仅匹配类型Person
的节点,而属性age
等于30
。
您可以通过在卷曲括号之间与逗号分开attribute: value
夫妇来查询多个属性。
有时可视化此类图并没有多大帮助,文本结果可能更有用。
因此,单击最后一个图上方的</>
图标,然后选择Text
;最后查询的输出将显示为文本:
连接节点并创建边缘
现在我们添加了两个节点之间的一个关系:
GRAPH.QUERY Social "MATCH (a:Person {name: 'Diana Hendrickson'}), (b:Person {name: 'Susan Hendrickson'}) CREATE (a)-[:KNOWS {relation: 'sister'}]->(b)"
查询的第一部分是找到2 Person
(“ Diana Hendrickson”和“ Susan Hendrickson”)的匹配。我们用a
和b
来辩护它们。
然后我们创建关系:
CREATE (a)-[:KNOWS {relation: 'sister'}]->(b)
关系总是用方括号写的。我们正在绑定a
和node b
的绑定,并具有KNOWS
类型的关系。 KNOWS
关系具有带有值sister
的属性relation
。
redis通知我们,它已经与一个属性建立了一种关系。
注意:添加存在节点之间关系的正确方法是首先匹配它们。如果我们尝试直接建立这种关系,例如:
CREATE (a:Person {name: 'Diana Hendrickson'})-[:KNOWS {relation: 'sister'}]->(b:Person {name: 'Susan Hendrickson'})
Redisgraph将创建2个新节点,并添加它们之间的关系
关系的通用查询具有以下形式:
(NodeA)-[:Relationship]->(NodeB)
花一分钟来欣赏雄辩和视觉上清除Cypher的语法是如何的。
。好吧,现在我们可以在图中添加更多关系:
GRAPH.QUERY Social "MATCH (a:Person {name: 'Susan Hendrickson'}), (b:Person {name: 'Peter Steinmetz'}) CREATE (a)-[:KNOWS {relation: 'married'}]->(b)"
GRAPH.QUERY Social "MATCH (a:Person {name: 'Susan Hendrickson'}), (b:Person {name: 'Louise Rosol'}) CREATE (a)-[:KNOWS {relation: 'friend'}]->(b)"
GRAPH.QUERY Social "MATCH (a:Person {name: 'Peter Steinmetz'}), (b:Person {name: 'Bryce Fett'}) CREATE (a)-[:KNOWS {relation: 'friend'}]->(b)"
GRAPH.QUERY Social "MATCH (a:Person {name: 'Laura Phillips'}), (b:Person {name: 'Louise Rosol'}) CREATE (a)-[:KNOWS {relation: 'coworker'}]->(b)"
GRAPH.QUERY Social "MATCH (a:Person {name: 'Laura Phillips'}), (b:Person {name: 'Diana Hendrickson'}) CREATE (a)-[:KNOWS {relation: 'coworker'}]->(b)"
GRAPH.QUERY Social "MATCH (a:Person {name: 'Louise Rosol'}), (b:Person {name: 'Diana Hendrickson'}) CREATE (a)-[:KNOWS {relation: 'coworker'}]->(b)"
让我们看看我们刚刚做了什么:
GRAPH.QUERY Social "MATCH (p:Person) RETURN p"
该图与以前相同与之前相同...为什么?
原因是RedisinShight默认情况下隐藏了关系。如果您在图表的右上侧启用“所有关系”幻灯片,Redisinsight还将向您显示节点之间的所有关系:
现在尝试在存在的节点和不存在的节点之间创建一个连接:
GRAPH.QUERY Social "MATCH (p:Person {name: 'Laura Phillips'}) CREATE (p)-[:KNOWS {relation: 'married'}]->(:Person {name: 'William Stultz', age:33})"
redisgraph为我们创建了未知节点(Person
'william stultz'),并添加已知节点和新节点之间的关系。
查询关系
既然我们已经在节点之间创建了一些“连接”,我们可以查询图表以在节点之间的关系。
假设我们想展示每个已婚的Person
:
GRAPH.QUERY Social "MATCH (p:Person)-[:KNOWS {relation:'married'}]->(o:Person) RETURN p,o"
或我们需要每个知道“苏珊·亨德里克森”的Person
的列表:
GRAPH.QUERY Social "MATCH (p:Person)-[:KNOWS]-(:Person {name: 'Susan Hendrickson'}) RETURN p"
在这里,我们对查询进行了一些微妙但重要的更改:首先,我们不需要Person
'Susan Hendrickson',所以我们没有对此添加别名。
第二:在重新绘制中,每个关系都有一个方向(从节点B上的节点A开始)。在上一个查询中给予:KNOWS
的指导是没有意义的(两个朋友彼此是朋友,这是双向关系)。
因此,我们在没有指定方向的情况下查询关系;语法(a)-[:KNOWS]->(b)
变成(a)-[:KNOWS]-(b)
。
如果不是“苏珊·亨德里克森”的熟人列表,我们只需要计数吗?
我们可以使用COUNT
聚合:
GRAPH.QUERY Social "MATCH (p:Person)-[:KNOWS]-(:Person {name: 'Susan Hendrickson'}) RETURN count(p)"
这里没有图表可以看到,因此RedisGraph仅显示COUNT
的文本输出:
删除节点和边缘
我们今天要查看的最后一个查询是DELETE
:
GRAPH.QUERY Social "MATCH (p:Person {name: 'William Stultz'}) DELETE p"
再次,我们首先是节点,然后我们DELETE
。
您可能还记得,我们在此节点与另一个Person
(“ Laura Phillips”)之间建立了关系。当我们删除一个节点时,其所有关系也将被删除。这似乎很明显,但这是要牢记的。
回顾
在这篇文章中,我们了解了Cypher的基础知识以及如何查询重新绘制。这个话题很广泛,我们已经涵盖了一小部分,只是为了让您入门。
在下一篇(和最后一篇)帖子中,我将向您展示一个更实用的Redisgraph的示例。