图数据建模图数据建模指南

举报
xcc-2022 发表于 2022/08/07 21:04:03 2022/08/07
【摘要】 目录Models and GoalsWe Already Communicate in GraphsThe Labeled Property Graph ModelQuerying Graphs: An Introduction to CypherCypher PhilosophyMATCHOther Cypher Clauses在前面的章节中,我们描述了图数据库与其他NOSQL存储和传统关...

目录

Models and Goals

We Already Communicate in Graphs

The Labeled Property Graph Model

Querying Graphs: An Introduction to Cypher

Cypher Philosophy

MATCH

Other Cypher Clauses


在前面的章节中,我们描述了图数据库与其他NOSQL存储和传统关系数据库相比的巨大优势。但是选择采用图形数据库后,出现了一个问题:如何在图形中建模?本章重点介绍图建模。首先从标签化的属性图模型(最广泛采用的图数据模型)的概述开始,然后我们概述用于本书中大多数代码示例的图查询语言:Cypher。尽管存在几种图形查询语言,但是Cypher部署最广泛,使其成为事实上的标准。它也很容易学习和理解,特别是对于那些来自SQL背景的人。有了这些基础知识之后,我们将直接研究一些图形建模的示例。在基于系统管理域的第一个示例中,我们比较了关系和图形建模技术。在第二个例子(莎士比亚文学的生产和消费)中,我们使用图来连接和查询几个不同的领域。在本章结束时,我们将介绍使用图形进行建模时的一些常见陷阱,并重点介绍一些良好做法。

Models and Goals

在深入研究图形建模之前,首先要对模型有所了解。建模是受特定需求或目标激励的抽象活动。我们进行建模是为了将不守法域的特定方面带入可以对其进行结构化和处理的空间。世界没有“真正的样子”的自然表象,只有许多有目的的选择,抽象和简化,其中一些在满足特定目标方面比其他有用。 25图形表示在这方面没有什么不同。但是,它们与许多其他数据建模技术的不同之处可能在于逻辑模型和物理模型之间的紧密联系。关系数据管理技术要求我们偏离域的自然语言表示形式:首先通过将表示形式组合成逻辑模型,然后将其强制为物理模型。这些转换在我们对世界的概念化与该模型的数据库实例化之间引入了语义不一致。使用图形数据库时,此差距会大大缩小。

We Already Communicate in Graphs

图建模自然符合我们倾向于使用圆和框从域中提取细节,然后通过用箭头和线将它们连接起来来描述这些事物之间的联系的方式。 当今的图形数据库比其他任何数据库技术都更“白板友好”。 问题的典型白板视图是图形。 我们在创意和分析模式下绘制的内容与我们在数据库内部实现的数据模型紧密对应。就表达能力而言,图形数据库减少了困扰关系数据库实现多年的分析和实现之间的阻抗失配。 这种图模型特别有趣的是,它们不仅传达了我们认为事物之间的关系的方式,而且还清晰地传达了我们想问的领域内的各种问题。 模型和图形查询实际上只是同一枚硬币的两个方面。

The Labeled Property Graph Model

我们在第1章中介绍了标记的属性图模型。总而言之,这些是其显着的特征

  • 带标签的属性图由节点,关系,属性和标签组成。 nodes, relationships, properties, and labels.
  • 节点包含属性。 将节点视为以任意键值对形式存储属性的文档。 在Neo4j中,键是字符串值是Java字符串和原始数据类型,以及这些类型的数组。
  • 节点可以用一个或多个标签标记。 标签将节点分组在一起,并指示它们在数据集中扮演的角色。
  • 关系连接节点并构造图。 关系始终具有一个方向,一个名称以及一个开始节点和一个结束节点,没有悬空的关系。 关系的方向和名称共同为节点的结构增加了语义的清晰度。
  • 像节点一样,关系也可以具有属性。 为关系添加属性的功能对于为图形算法提供其他元数据,为关系添加其他语义(包括质量和权重)以及在运行时约束查询特别有用。

Querying Graphs: An Introduction to Cypher

Cypher is an expressive (yet compact) graph database query language. Although currently specific to Neo4j, its close affinity with our habit of representing graphs as diagrams makes it ideal for programmatically describing graphs. For this reason, we use Cypher throughout the rest of this book to illustrate graph queries and graph constructions. Cypher is arguably the easiest graph query language to learn, and is a great basis for learning about graphs. Once you understand Cypher, it becomes very easy to branch out and learn other graph query languages.
In the following sections we’ll take a brief tour through Cypher. This isn’t a reference document for Cypher, however—merely a friendly introduction so that we can explore more interesting graph query scenarios later on. 

Cypher是一种表现力强(但很紧凑)的图形数据库查询语言。 尽管目前特定于Neo4j,但它与我们将图形表示为图形的习惯紧密相关,这使其非常适合以编程方式描述图形。

因此,在本书的其余部分中,我们将使用Cypher来说明图形查询和图形构造。 Cypher可以说是最容易学习的图形查询语言,并且是学习图形的重要基础。 一旦了解了Cypher,就可以很容易地进行分支和学习其他图形查询语言。在以下各节中,我们将简要介绍Cypher。 但是,这不是Cypher的参考文档,它只是一个友好的介绍,因此以后我们可以探索更有趣的图形查询方案。

Cypher Philosophy

Cypher is designed to be easily read and understood by developers, database professionals, and business stakeholders. Its ease of use derives from the fact that it is in accord with the way we intuitively describe graphs using diagrams.
Cypher enables a user (or an application acting on behalf of a user) to ask the database to find data that matches a specific pattern. Colloquially, we ask the database to“find things like this.” And the way we describe what “things like this” look like is to draw them, using ASCII art. Figure 3-1 shows an example of a simple pattern. 

Cypher旨在使开发人员,数据库专业人员和业务利益相关者易于阅读和理解。 它的易用性源于以下事实:它与我们使用图直观地描述图形的方式一致。
Cypher使用户(或代表用户运行的应用程序)能够要求数据库查找与特定模式匹配的数据。 通俗地说,我们要求数据库“查找类似的东西”。 我们描述“类似事物”的样子的方式是使用ASCII艺术画它们。 图3-1显示了一个简单模式的示例。

(emil)<-[:KNOWS]-(jim)-[:KNOWS]->(ian)-[:KNOWS]->(emil)

This pattern describes a path that connects a node we’ll call  jim to two nodes we’ll call ian and  emil , and which also connects the  ian node to the  emil node.  ian ,  jim , and emil are identifers. Identifiers allow us to refer to the same node more than once when describing a pattern—a trick that helps us get round the fact that a query language has only one dimension (text proceeding from left to right), whereas a graph diagram can be laid out in two dimensions. Despite having occasionally to repeat identifiers in this way, the intent remains clear. Cypher patterns follow very naturally from the way we draw graphs on the whiteboard.

此模式描述了一条路径,该路径将一个称为jim的节点连接到两个称为ian和emil的节点,还将ian节点连接到emil节点。 ian,jim和emil是标识符。 标识符使我们在描述模式时可以多次引用同一个节点—一种技巧,可以帮助我们绕过以下事实:查询语言只有一个维度(文本从左到右),而可以放置图形图 二维地 尽管偶尔会以这种方式重复标识符,但意图仍然很明确。 密码模式非常自然地遵循我们在白板上绘制图形的方式。

The previous Cypher pattern describes a simple graph structure, but it doesn’t yet refer to any particular data in the database. To bind the pattern to specific nodes and relationships in an existing dataset we must specify some property values and node labels that help locate the relevant elements in the dataset. For example:

先前的Cypher模式描述了一种简单的图形结构,但尚未引用数据库中的任何特定数据。 要将模式绑定到现有数据集中的特定节点和关系,我们必须指定一些属性值和节点标签,以帮助在数据集中定位相关元素。 例如:

(emil:Person {name:'Emil'})
<-[:KNOWS]-(jim:Person {name:'Jim'})
-[:KNOWS]->(ian:Person {name:'Ian'})
-[:KNOWS]->(emil)
Here we’ve bound each node to its identifier using its name property and  Person label. The  emil identifer, for example, is bound to a node in the dataset with a label  Person and a  name property whose value is  Emil . Anchoring parts of the pattern to real data in this way is normal Cypher practice, as we shall see in the following sections.

在这里,我们使用其name属性和Person标签将每个节点绑定到其标识符。 例如,emil identifer绑定到数据集中的一个节点,该节点的标签为Person,名称属性为Emil。 以这种方式将模式的某些部分固定到实际数据是Cypher的常规做法,我们将在以下各节中看到。

ASCII art graph patterns are fundamental to Cypher. A Cypher query anchors one or more parts of a pattern to specific locations in a graph using predicates, and then flexes the unanchored parts around to find local matches.

ASCII艺术图形模式是Cypher的基础。 Cypher查询使用谓词将模式的一个或多个部分锚定到图形中的特定位置,然后弯曲未锚定的部分以查找局部匹配项。

The anchor points in the real graph, to which some parts of the pattern are bound, are determined by Cypher based on the labels and property predicates in the query. In most cases, Cypher uses metainformation about existing indexes, constraints, and predicates to figure things out automatically. Occasionally, however, it helps to specify some additional hints.

Cypher根据查询中的标签和属性谓词确定实际图形中与模式的某些部分绑定到的锚点。 在大多数情况下,Cypher使用有关现有索引,约束和谓词的元信息来自动找出问题。 但是,有时它有助于指定一些其他提示。

Like most query languages, Cypher is composed of clauses. The simplest queries consist of a  MATCH clause followed by a  RETURN clause (we’ll describe the other clauses you can use in a Cypher query later in this chapter). Here’s an example of a Cypher query that uses these three clauses to find the mutual friends of a user named  Jim 

像大多数查询语言一样,Cypher由子句组成。 最简单的查询由MATCH子句和RETURN子句组成(我们将在本章稍后介绍在Cypher查询中可以使用的其他子句)。 这是一个使用以下三个子句查找名为Jim的用户的共同朋友的Cypher查询示例

MATCH (a:Person {name:'Jim'})-[:KNOWS]->(b)-[:KNOWS]->(c),
(a)-[:KNOWS]->(c)
RETURN b, c

MATCH

The  MATCH clause is at the heart of most Cypher queries. This is the specification by example part. Using ASCII characters to represent nodes and relationships, we draw the data we’re interested in. We draw nodes with parentheses, and relationships using pairs of dashes with greater-than or less-than signs ( --> and  <-- ). The  < and  > signs indicate relationship direction. Between the dashes, set off by square brackets and prefixed by a colon, we put the relationship name. Node labels are similarly prefixed by a colon. Node (and relationship) property key-value pairs are then specified within curly braces (much like a Javascript object).
In our example query, we’re looking for a node labeled  Person with a  name property whose value is  Jim . The return value from this lookup is bound to the identifier  a .This identifier allows us to refer to the node that represents Jim throughout the rest of the query.
This start node is part of a simple pattern  (a)-[:KNOWS]->(b)-[:KNOWS]->(c), (a)-[:KNOWS]->(c) that describes a path comprising three nodes, one of which we’ve bound to the identifier  a , the others to  b and  c . These nodes are connected by way of several  KNOWS relationships, as per Figure 3-1.
This pattern could, in theory, occur many times throughout our graph data; with alarge user set, there may be many mutual relationships corresponding to this pattern.To localize the query, we need to anchor some part of it to one or more places in the graph. In specifying that we’re looking for a node labeled  Person whose  name property value is  Jim , we’ve bound the pattern to a specific node in the graph—the node representing Jim. Cypher then matches the remainder of the pattern to the graph immediately surrounding this anchor point. As it does so, it discovers nodes to bind to the other identifiers. While  a will always be anchored to Jim,  b and  c will be bound to a sequence of nodes as the query executes.

MATCH子句是大多数Cypher查询的核心。这是示例说明。使用ASCII字符表示节点和关系,我们绘制我们感兴趣的数据。我们绘制带有括号的节点,并使用带有大于或小于号(->和<-)的破折号对绘制关系。 <和>符号指示关系方向。在短划线之间,用方括号括起来,并用冒号作为前缀,我们放置了关系名称。节点标签类似地以冒号作为前缀。然后,在花括号内(非常像Javascript对象)指定节点(和关系)属性键值对。
在示例查询中,我们正在寻找一个名为Person的节点,其名称属性为Jim。该查询的返回值绑定到标识符a。该标识符使我们可以在整个查询的其余部分中引用表示Jim的节点。
该起始节点是描述路径的简单模式(a)-[:KNOWS]->(b)-[:KNOWS]->(c),(a)-[:: KNOWS]->(c)的一部分包含三个节点,其中一个节点已绑定到标识符a,其他节点已绑定到b和c。这些节点通过几种KNOWS关系连接,如图3-1所示。
从理论上讲,这种模式可以在我们的图形数据中多次出现。对于较大的用户集,可能与此模式对应许多相互关系。要对查询进行本地化,我们需要将查询的某些部分锚定到图中的一个或多个位置。在指定我们要查找标记为名称属性值为Jim的Person的节点时,我们已将模式绑定到图中的特定节点(代表Jim的节点)。然后,Cypher将模式的其余部分与紧靠该锚点的图形进行匹配。这样,它将发现要绑定到其他标识符的节点。尽管a将始终固定在Jim上,但是b和c将在查询执行时绑定到一系列节点上。

MATCH (a:Person)-[:KNOWS]->(b)-[:KNOWS]->(c), (a)-[:KNOWS]->(c)
WHERE a.name = 'Jim'
RETURN b, c

Other Cypher Clauses

我们可以在Cypher查询中使用的其他子句包括:
WHERE

提供用于过滤模式匹配结果的条件。
CREATE and  CREATE UNIQUE
Create nodes and relationships.
MERGE
通过重用与提供的谓词匹配的现有节点和关系,或者通过创建新的节点和关系,确保图中存在提供的模式。

DELETE
Removes nodes, relationships, and properties.
SET
Sets property values.
FOREACH
Performs an updating action for each element in a list.
UNION
Merges results from two or more queries.
WITH
链接后续查询部分并将结果从一个查询转发到下一个查询。 类似于Unix中的管道命令。
START
在图中指定一个或多个明确的起点-节点或关系。 (不建议使用START,而应在MATCH条款中指定锚点。)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。