本文的学习目标是探索图数据库及其用途。将通过Neo4j来了解如何创建图数据库架构,并探索Neo4j的一些基本功能。
在图数据库中,图表示一系列节点和这些节点之间的关系。节点可以被视为现实世界中的对象。例如,一个人、一个国家、一本书或一个电影标题可以被视为一个节点。这些节点通过一个或多个(通常是多个)节点通过某些关系连接。考虑下面的图像,有一个样本节点和关系图。
圆圈代表节点,箭头代表它们之间的关系。请注意,这些箭头代表方向。在案例中,只包括了单向链接,而双向或自链接在图数据库中也是可能的。人(纳伦德拉·莫迪先生)、印度国旗(代表印度)、政治家和总理是节点。这些节点之间总共有5个链接或关系。以下是可以从图中得出的节点和关系。
Neo4j
是一个图数据库管理系统,用于构建原生图数据库,存储和管理数据关系,并能够提供快速查询。Neo4j的社区版是一个开源工具,遵循GPLv3许可。它有助于构建在图数据库中看到的节点和关系,以及额外的功能,如定义节点标签和属性。
节点标签 - 节点可以被赋予标签,这使能够将节点归入同一类别。例如,在前一个例子中,可以给纳伦德拉·莫迪先生贴上“人”的标签,或者给印度国旗贴上“国家”的标签。这些标签使能够通过查询更容易地搜索特定对象。
节点属性 - 属性是键值对,可以分配给节点或关系。在示例中,可以为纳伦德拉·莫迪先生的节点添加一个属性,键为“年龄”,值为“70”。对于印度节点,可以有印度的属性,如人口、GDP等,作为键值对。
现在,对图数据库、节点、关系和Neo4j功能有了相当的理解,让进一步学习如何使用Neo4j创建基本的图数据库。首先,需要从安装Neo4j Desktop社区版或企业版。可以免费获得企业版的开发者许可。下载应用程序后,按照以下步骤创建一个新项目并分配一个数据库来工作。
执行这些步骤后,可以看到控制台栏,可以开始编写Neo4j图查询。
可以通过编写查询来创建节点和关系来开始处理数据库。
‘CREATE’命令在图数据库中创建一个节点。最基本的节点是没有标签或属性的,这意味着它是一个空白或空节点。然而,这个节点将有一个ID,这是一个整数值。这个ID默认提供给每个创建的节点,并且是唯一的。可以使用查询创建一个空节点:
CREATE ()
要创建一个带有标签的节点,可以使用冒号后跟标签名称来提供它。要创建一个带有‘政治家’标签的节点,可以使用查询:
CREATE (:Politician)
还可以为节点提供多个标签。要提供多个标签,可以按照相同的模式继续写冒号后跟标签名称。要创建一个带有‘国家’、‘亚洲’和‘印度’标签的节点,可以使用查询:
CREATE (:Country:Asia:India)
如上所述,节点可以有一个或多个属性和标签。这些属性可以作为花括号中的键值对提供{key: value}。让创建一个标记为‘人’的节点,并为键‘name’提供属性‘纳伦德拉·莫迪先生’,70岁为键‘age’。
CREATE (:Person{name: '纳伦德拉·莫迪先生', age: 70})
成功运行上述查询后,可以使用查询查看节点:
MATCH (node) RETURN (node)
下图是查询输出,有4个节点。可以通过将鼠标悬停在它上面来查看特定节点的标签和属性。在图像中,可以看到节点ID 3的标签‘人’和属性‘name’和‘age’。
本节将展示如何在节点之间创建关系。这里有一个快速提示,用于清除数据库中的所有现有节点和关系;可以使用查询:
MATCH (n) DETACH DELETE (n)
首先,让看看如何创建一个节点的自链接,表示节点之间的关系。将创建一个‘人’节点,并添加一个爱的关系到同一个节点,展示一个人的自爱。
CREATE(p:Person{name: '拉姆'})-[:loves]->(p)
让快速看一下这个查询。‘p’作为查询的引用变量名。请注意,可以在创建节点时添加这个引用变量,如前一节所示。给这个节点提供的标签是‘人’,一个‘name’属性,值为‘拉姆’。方括号内的内容代表试图定义的关系类型。箭头代表这种关系的方向。引用变量名有助于在查询末尾提到的地方分配这种关系。
还可以为给定的关系提供属性。考虑之前的节点,想要添加一个属性,键为‘since’,值为‘always’。
CREATE(p:Person{name: '拉姆'})-[:loves{since: 'always'}]->(p)
要定义两个不同节点之间的关系,可以创建两个节点,然后使用引用变量定义关系。让创建一个印度和她的总理之间的关系。注意,可以使用控制台中的shift enter同时编写多个查询。
CREATE (p1:Person{name: '纳伦德拉·莫迪先生'})
CREATE (c1:Country{name: '印度'})
CREATE (p1)-[r1:prime_minister]->(c1)
MATCH (node) RETURN (node)