📜  Neo4j数据建模(1)

📅  最后修改于: 2023-12-03 15:17:51.108000             🧑  作者: Mango

Neo4j数据建模

Neo4j是一款双向图形数据库。 如果您需要在数据中以高效,交互式和可扩展的方式表示关系,则很可能适合使用图形数据库。 在本文中,我们将介绍如何使用Neo4j建立数据模型和查询。

建模
节点和属性

在Neo4j中,数据以节点(node)的形式存在。 节点可以具有属性(property)。 属性是键值对,例如,用户节点可以具有属性如ID号,名称和电子邮件地址。 下面是一个示例,我们将添加两个对象:'人'和'城市'。 他们都具有属性来描绘他们。

CREATE (:Person { name: 'John Doe', age: 30, email: 'johndoe@example.com' })
CREATE (:City { name: 'Berlin' })

这将创建两个节点,一个名为“John Doe”的人和Berlin市节点。 请注意,创建节点的语法使用冒号指定节点的标签(label)和大括号{}用于定义节点属性。

关系

然而,这两个节点并不是孤立的,他们之间可能存在关联。在Neo4j中,这些关联是通过边(edge)实现的。 边具有一个方向,可以是单向的,也可以是双向的,例如基于兴趣的关系可以是双向的。 下面是一个示例,展示如何在节点之间创建关系:

MATCH (person:Person), (city:City)
WHERE person.name = 'John Doe' AND city.name = 'Berlin'
CREATE (person)-[:LIVES_IN]->(city)

这将创建一个名为“LIVES_IN”的关系,描述了John Doe居住在柏林。 请注意,关系是通过括号和中括号来表示的。 括号表示节点,中括号表示关系。 右箭头(->)表示关系的方向。

表示多值属性和数组

节点的属性可以是多值的。 例如,一个人可能会使用多个电话号码或多个电子邮件地址。 在Neo4j中,我们可以使用数组来表示此类多值属性。 下面是一个示例:

CREATE (:Person { name: 'Jane Doe', phones: ['555-1234', '555-5678'], emails: ['jane@example.com', 'janedoe@example.com'] })

这将创建一个名为“Jane Doe”的节点,并将其电话号码和电子邮件地址存储在数组中。

查询
基本查询

查询语言Cypher是Neo4j的核心。 它具有SQL等表格型数据库的查询语言常用的基本语法元素,同时也支持一些图形数据库最常见的查询操作。

下面是一个查询,返回所有居住在柏林的人员的姓名:

MATCH (person:Person)-[:LIVES_IN]->(:City { name: 'Berlin' })
RETURN person.name

多个节点和关系可以通过使用逗号和枚举号来指定多个,如下所示:

MATCH (person:Person)-[:LIVES_IN]->(:City { name: 'Berlin' }), (otherPerson:Person)
WHERE person.name = 'John Doe' AND otherPerson.age > 25
RETURN person.name, otherPerson.name
聚合查询

在有些情况下,我们希望聚合查询结果,例如计算平均值,最大值等等。 Neo4j在这方面提供了很多支持,例如下面的查询将返回存储在属性“age”的所有人中的平均年龄:

MATCH (person:Person)
RETURN avg(person.age)
展示多值属性和数组

我们可以使用Cypher中的UNWIND函数将数组中的元素作为单独的行返回。 下面是一个示例,返回所有人员的电话号码:

MATCH (person:Person)
UNWIND person.phones AS phone
RETURN person.name, phone
总结

我们在本文中看到,如何使用Neo4j来建立数据模型和查询。 在实践中,您会发现,在数据具有复杂且不规则的关系时,图形数据库可以非常有效。 为了更好地了解Neo4j,请参阅官方文档。