GraphGists

使用皇帝弗里德里希三世的王室政务记录学习图世界的初步知识

使用皇帝弗里德里希三世的王室政务记录在图数据库中迈出第一步的GraphGist

使用皇帝弗里德里希三世的王室政务记录在图数据库中迈出第一步。

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

B1 手动创建图数据库

B1.1 节点

创建和查找

使用命令 "CREATE" 创建一个节点,节点由两个括号表示:()。在括号内,您可以为节点分配一个变量,例如 "n" 表示 "node":(n)。变量 n 后面跟着双冒号,然后是节点的类型或标签。在此命令中,您现在可以使用 "n" 指代创建的节点。该变量仅在命令以分号终止之前有效。之后不会保存,可以反复重新分配。

使用命令 "RETURN" 可以输出(显示)某些内容。根据结果,可以以图形或表格形式显示。可以使用 "RETURN n;" 显示刚刚创建的节点 (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,我们可以通过属性(在本例中是 name)来搜索他。

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

表示:"创建一个 person 类型的节点,属性 "name" 为 Friedrich,此处称为 f,并显示 f。"

使用出生日期搜索方式相同。

练习

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

2. 现在创建以下节点:

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

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

  • 一个 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

删除

*

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

;

命令结束

© . All rights reserved.