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

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。"。
使用出生日期也可以用同样的方式进行。
解决方案
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" 边,即分别在一个方向上创建一次。
练习
-
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 |
删除 |
* |
由此命令创建或找到的所有内容 |
; |
命令结束 |
此页面是否有帮助?