GraphGists

使用 GraphGist 学习图世界的第一步,以弗里德里希三世皇帝的记录为基础。

使用弗里德里希三世皇帝的记录进行图数据库第一步的 GraphGist。

使用 弗里德里希三世皇帝的记录 进行图数据库第一步。

490px Hans Burgkmair d. %C3%84. %28zugeschr.%29   Bildnis Kaiser Friedrich III

B1 手动创建图数据库

B1.1 节点

创建和查找

使用命令 "CREATE" 创建一个节点,由两个括号表示:() 在括号内,将一个变量分配给节点,例如 "n" 代表 "节点":(n)。n 后面跟着一个双冒号,然后是节点的类型或标签。在这个命令中,您可以使用 "n" 来引用创建的节点。变量只在命令用分号结束时有效。它不会在之后保存,可以一次又一次地重新分配。

使用命令 "RETURN" 可以输出(显示)某些内容。根据结果,这可以通过图形或表格形式完成。使用 "RETURN n;" 可以显示刚使用 "CREATE" 创建的节点 (n),或者使用 "RETURN *;" 可以显示在命令中创建或找到的所有内容。星号代表命令中创建或找到的所有节点和边。分号结束命令。

CREATE (n:Person) RETURN n;

意味着:"创建一个节点,在这里称为 n,类型为 Person,然后显示给我看 n。"。

命令 "MERGE" 首先检查是否存在相应的节点;如果不存在,则再次创建。

MERGE (n:Person) RETURN n;

意味着:"检查是否存在类型为 Person 的节点。如果不存在,则创建一个并显示给我看 n。"。

删除和切断

为了删除节点,我们使用 DELETE 命令。首先,我们必须在数据库中找到要删除的所有节点。我们可以使用 MATCH 命令来完成此操作。

MATCH (n:Person) DELETE n

意味着:"查找标签为 Person 的节点 n,然后删除 n。"。

这之所以有效,是因为我们的节点目前还没有与其他节点连接(边)。为了删除数据库中已连接的节点,必须首先使用 DETACH 命令删除其边。

MATCH (n) DETACH DELETE n

意味着:"查找节点,以下称为 n,删除关联的边,然后删除 n。"。

顺便说一下,命令 "MATCH (n) DETACH DELETE n" 会删除整个数据库,因为该命令会查找、切断并删除每个节点。

但是,如何在网络中引用特定节点?

类型和属性

到目前为止,我们可以使用标签创建节点。为了向节点添加更多信息,我们为它们提供单独的属性(例如,姓名、出生日期、居住地、死亡地点……)。节点类型和属性不是预先定义的,可以根据需要进行创建。(参见:数据建模)。

有两种方法可以添加属性:在创建节点时添加或之后添加。

CREATE (f:Person {name:'Friedrich'}) RETURN f;

意味着:"创建一个类型为 Person 的节点,属性为 name,值为 "Friedrich",然后显示给我看。"。

稍后设置属性

现在,如果我们要为 Friedrich 添加另一个属性,我们可以使用 SET 来添加。重要的是,在我们要继续使用变量 f 来引用节点时,不要用分号结束命令,如上面所示。

MATCH (f:Person {name:'Friedrich'})
SET f.dateOfBirth = '1415-09-21'
RETURN f;

意味着:"查找类型为 Person 的节点,其中属性 'name' 包含值 'Friedrich',该节点在下文中称为 'f'。为 'f' 创建属性 'date of birth',其值为 '1415-09-21'。显示给我看 f。"。

信息:标签以大写字母开头,属性以小写字母或驼峰命名法(例如 dateOfBirth)表示,因为不允许使用空格。

如果我们想在图数据库中找到 Friedrich,我们可以通过属性(在本例中是姓名)来搜索他。

MATCH (f:Person {name:'Friedrich'}) RETURN f;

意味着:"创建一个类型为 Person 的节点,属性为 "name" Friedrich,在这里称为 f,然后显示给我看 f。"。

使用出生日期也可以用同样的方式进行。

练习

1 首先删除所有现有的节点和边。

2 现在创建以下节点

  • 一个类型为 Person 的节点,属性为 Name "Friedrich"。

  • 一个类型为 Person 的节点,属性为 Name "Serious"。

  • 一个类型为 Person 的节点,属性为 Name "Cimburgis"。

  • 显示结果。

3 添加以下出生日期

  • Friedrich:1415-09-21

  • Ernst:1377

  • Cimburgis:1394 或 1397

  • 显示结果。

解决方案

1. 首先删除所有现有的节点和边

MATCH (n) DETACH DELETE n

2. 现在创建以下节点

CREATE (f:Person {name:'Friedrich'})
CREATE (e:Person {name:'Ernst'})
CREATE (c:Person {name:'Cymburgis'})
RETURN *;

3. 添加以下出生日期

MATCH (f:Person {name:'Friedrich'})
MATCH (c:Person {name:'Cymburgis'})
MATCH (e:Person {name:'Ernst'})

SET f.DateOfBirth = '1415-09-21'
SET e.DateOfBirth = '1377'
SET c.DateOfBirth = '1394'

RETURN *;

B1.2 边

创建和查找

两个节点之间的边(连接、关系)在 Cypher 中用箭头表示。

-->

边总是带方向。

此外,还必须指定边类型。-[:CHILD_OF]->

信息:边的类型以大写字母开头。

边与节点一样,使用 CREATE 或 MERGE 命令创建,并使用 MATCH 在数据库中搜索。

两个节点之间的边在 Cypher 中如下所示

(f)-[r:CHILD_OF]->(e)

边的变量为 r。这对于在后续命令中引用边非常重要。

为了创建边,我们必须使用 MERGE 或 CREATE 创建相应的节点,或者使用 MERGE 或 MATCH 从数据库中调用它们。对于少量数据,MERGE 始终是最安全的方法。

示例 1:子女和父母

MERGE (f:Person {name:'Friedrich'})
MERGE (c:Person {name:'Cimburgis'})
MERGE (e:Person {name:'Ernst'})

CREATE (f)-[:CHILD_OF]->(c)
CREATE (f)-[:CHILD_OF]->(e)
RETURN *;

意味着:"查找或创建一个类型为 Person 的节点,属性为 name "https://en.wikipedia.org/wiki/Frederick_III,Holy_Roman_Emperor[Friedrich]",以下称为 f。
查找或创建一个类型为 Person 的节点,属性为 name "Cimburgis",以下称为 c
查找或创建一个类型为 Person 的节点,属性为 name "https://en.wikipedia.org/wiki/Ernest_of_Austria
(Habsburg)[Ernest]",以下称为 e。
从 f 到 c 创建一个类型为 "child of" 的边。
从 f 到 e 创建一个类型为 "child of" 的边。
显示刚刚找到或创建的所有内容。"。

示例 2:已婚夫妇

MERGE (c:Person {name:'Cimburgis'})
MERGE (e:Person {name:'Ernst'})
CREATE (e)-[:SPOUSE_OF]->(c)
CREATE (c)-[:SPOUSE_OF]->(e)
RETURN *;

意味着:"查找或创建一个类型为 "person" 的节点,在这里称为 c,其中属性为 name "Cimburgis"。
查找或创建一个类型为 "person" 的节点,在这里称为 e,其中属性为 name "Ernst"。
从节点 e 到节点 c 创建一个类型为 "SPOUSE_OF" 的边。
从节点 c 到节点 e 创建一个类型为 "SPOUSE_OF" 的边。
显示刚刚找到或创建的所有内容。"。

*顺便说一下:由于 Cypher 中的边始终具有方向性,而婚姻是基于互惠性的,因此我们需要创建两次 "SPOUSE_OF" 边,即分别在一个方向上创建一次。

练习

现在使用 MERGE、MATCH 和 CREATE 命令创建以下边,如果它们尚不存在,则创建所需的节点。
  • Eleonore 与 Frederick 结婚。

  • Friedrich 与 Eleonore 结婚。

  • Gwendolyn 是 Frederick 的孩子。

  • Cunegund 是 Eleonore 的孩子。

  • Maximilian 是 Friedrich 的孩子。

  • Maximilian 是 Cunegond 的孩子。

解决方案

MERGE (f:Person {name:'Friedrich'})
MERGE (e:Person {name: 'Eleonore'})
MERGE (k:Person {name: 'Gwendolyn'})
MERGE (m:Person {name:'Maximilian'})

CREATE (f)-[:MARRIED_WITH]->(e)
CREATE (e)-[:MARRIED_WITH]->(f)

CREATE (k)-[:CHILD_OF]->(f)
CREATE (k)-[:CHILD_OF]->(e)

CREATE (m)-[:CHILD_OF]->(f)
CREATE (m)-[:CHILD_OF]->(e)

RETURN *;

B 1.3 重复

您现在已经了解了

术语 解释

(variable:type {property})

节点

-[:type]->

MATCH

查找

CREATE

创建

MERGE

查找,如果不可用则创建

SET

添加属性

RETURN

显示

DETACH

切断

DELETE

删除

*

由此命令创建或找到的所有内容

;

命令结束