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

在本系列的第一篇文章中,我们查看了什么是图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

输出应与此相似:

after first CREATE

第一次在不存在的图中创建e节点时,redisgraph将为我们创建图形。
因此,我们刚刚创建了一个名为“ Social”的新图,并添加了一个类型的“人”节点。
nameage是我们添加到节点的属性。 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

结果图应该是这样的:

MATCH-ing all nodes

上一个查询也可以写为:

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;最后查询的输出将显示为文本:

MATCH results as 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”)的匹配。我们用ab来辩护它们。

然后我们创建关系:

CREATE (a)-[:KNOWS {relation: 'sister'}]->(b)

关系总是用方括号写的。我们正在绑定a和node b的绑定,并具有KNOWS类型的关系。 KNOWS关系具有带有值sister的属性relation

Edge creation

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还将向您显示节点之间的所有关系:

All edges created

现在尝试在存在的节点和不存在的节点之间创建一个连接:

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的文本输出:

COUNT nodes

删除节点和边缘

我们今天要查看的最后一个查询是DELETE

GRAPH.QUERY Social "MATCH (p:Person {name: 'William Stultz'}) DELETE p"

再次,我们首先是节点,然后我们DELETE


您可能还记得,我们在此节点与另一个Person(“ Laura Phillips”)之间建立了关系。当我们删除一个节点时,其所有关系也将被删除。这似乎很明显,但这是要牢记的。

回顾

在这篇文章中,我们了解了Cypher的基础知识以及如何查询重新绘制。这个话题很广泛,我们已经涵盖了一小部分,只是为了让您入门。

在下一篇(和最后一篇)帖子中,我将向您展示一个更实用的Redisgraph的示例。