Neo4j Cypher 语言基础

  |   0 评论   |   0 浏览

Cypher 语言基础

Cypher 查询的基本结构通常包含以下几个部分:

  1. =‌MATCH‌= :指定要查询的图模式。
  2. =‌WHERE‌= :提供条件过滤,以限制返回的结果。
  3. =‌RETURN‌= :定义应该返回哪些数据。
  4. =‌其他子句‌= :如 CREATE, MERGE, SET, DELETE 等,用于修改图形数据。

示例查询

以下是一些基本的 Cypher 查询示例:

  1. =‌查找所有节点‌= :
cypherCopy Code
MATCH (n) RETURN n
  1. =‌查找特定类型的所有节点‌= :
cypherCopy Code
MATCH (n:Person) RETURN n
  1. =‌查找具有特定属性的节点‌= :
cypherCopy Code
MATCH (n:Person {name: 'Alice'}) RETURN n
  1. =‌查找两个节点之间的关系‌= :
cypherCopy Code
MATCH (a:Person)-[r]->(b:Person) RETURN a, r, b
  1. =‌创建新节点和关系‌= :
cypherCopy Code
CREATE (a:Person {name: 'Alice'}) CREATE (b:Person {name: 'Bob'}) CREATE (a)-[r:FRIEND]->(b) RETURN a, r, b
  1. =‌更新节点属性‌= :
cypherCopy Code
MATCH (n:Person {name: 'Alice'}) SET n.age = 30 RETURN n
  1. =‌删除节点和关系‌= :
cypherCopy Code
MATCH (a:Person)-[r]->(b:Person) WHERE a.name = 'Alice' AND b.name = 'Bob' DELETE r DELETE a, b

Cypher用于从Neo4j查询数据。它是一种高度优化的查询语言,能够理解每个节点之间存储的连接。它与通常的SQL查询有很大不同,因为在图数据库中不存在表的概念(查询数据库时不会再有JOIN噩梦)。

大多数情况下,你会使用以下从句:

  • MATCH
  • CREATE
  • MERGE

MATCH

MATCH子句用于读取数据。您可以将其视为SQL中的SELECT子句。它描述了图形数据的一个模式,Neo4j将使用该模式来检索与该模式匹配的所有路径。下面的示例演示了从现有数据库获取所有数据的查询。为了获取数据,需要显式地指定RETURN子句。

MATCH (n) RETURN (n)

Neo4j根据您的需求为我们提供了四种不同的最终结果:

  • graph
  • table
  • text
  • code

图形graph显示了节点之间的可视化以及节点之间的关系。

Table以表格形式显示每个节点的标签、属性等信息。

另一方面,Text显示整个查询输出,就像您在查询SQL数据库时看到的那样。

如果您通过Code查询,Code将为您提供响应信息。

你可以把它约束 constraint成一个 特定的模式 。例如,要返回数据库中的所有电影:

MATCH (movie:Movie)
RETURN movie.title

此外,它还经常与 WHERE子句配对 ,因为 MATCH子句只描述结构 ,而 WHERE子句决定查询的内容 。让我们看一下下面的例子,它找到了一个叫史蒂文·斯皮尔伯格的导演执导的所有电影。

MATCH (director:Person)-[:DIRECTED]->(movie)
WHERE director.name = "Steven Spielberg"
RETURN movie.title

上面给出的示例基于 外向关系 。箭头的方向将在传入关系中反转。例如,找到所有在电影《流浪地球》中出演过的演员。

MATCH (m:Movie { title: 'Wandering Earth' })<-[:ACTED_IN]-(actor)
RETURN actor.name

通过 管道符号|匹配多个关系 ,如下所示:

MATCH (m:Movie { title: 'Wandering Earth' })<-[:ACTED_IN|:DIRECTED]-(person)
RETURN person.name

返回所有在电影《流浪地球》中出演或导演的名字。

CREATE

CREATE子句主要用于创建数据,就像SQL中的INSERT子句一样。您需要指定 命名节点及其与内联属性的关系 。您可以轻松地创建一个代表PERSON标签的新节点,如下所示:

CREATE (n:Person)

一个节点可以 有零个或多个标签。 下面的查询创建了一个带有两个标签(Person和Malaysian)的节点。

CREATE (n:Person:Malaysian)

节点也可以有自己的属性。你可以使用字典样式的语法同时创建一个带有标签和属性的节点:

CREATE (n:Person { name: 'Wai Foong', title: 'AI Engineer' })

您可以 通过return子句查询并返回新创建的数据 。下面的示例将返回一行数据,即AI Engineer。

CREATE (n:Person { name: 'Wai Foong', title: 'AI Engineer' })
RETURN n.title

节点之间的关系可以通过以下语法创建,其中A和B表示节点。

A-[:RELTYPE]->B

对于创建新的 节点和关系 ,您可以这样指定:

CREATE (a:Person {name:"A"})-[:IS_FRIEND_OF]->(b:Person {name:"B"})

如果您已经有了现有的节点,并且希望在它们之间创建连接,则需要首先通过MATCH子句获取节点。

MATCH (a:Person),(b:Person)
WHERE a.name = 'A' AND b.name = 'B'
CREATE (a)-[:IS_FRIEND_OF]->(b)

MERGE

与CREATE子句不同, MERGE子句在创建新数据之前首先确定图中是否存在模式 。您可以将其视为 MATCH和CREATE的组合其中它根据模式匹配现有数据或从中创建新数据 。下面的示例将创建一个新节点, 因为并非所有属性都与任何现有节点匹配 (与我们之前创建的属性调用年龄相比,还有一个额外的属性调用年龄)。

MERGE (n:Person { name: 'Wai Foong', title: 'AI Engineer', age: 28})
RETURN n

您可以将MERGE子句与两个附加子句组合在一起:

  • ON_CREATE -如果没有找到匹配并创建新节点时执行的操作
  • ON_MATCH -找到匹配时执行的操作

下面的示例使用名称和已创建的属性创建一个新的Person节点。在创建时,创建的属性将被设置为当前时间戳。

MERGE (n:Person { name: 'Wai Foong' })
ON CREATE SET n.updatetime = timestamp()
RETURN n.name, n.updatetime

另一方面,当且仅当找到匹配项时,下面的示例设置updatetime属性。

MERGE (n:Person { name: 'Wai Foong' })
ON MATCH SET n.updatetime = timestamp()
RETURN n.name, n.updatetime

您可以组合这两个子句,并根据是否找到匹配项或是否创建了新节点来设置属性。

MERGE (n:Person { name: 'Wai Foong' })
ON CREATE SET n.created = timestamp()
ON MATCH SET n.found = TRUE
RETURN n.name, n.created, n.found

使用MERGE子句时,请记住以下几点:

  1. 没有绑定变量的MERGE会创建重复的元素。
  2. 带有绑定变量的MERGE重用现有的图元素。
  3. 对不同的用例使用绑定和未绑定变量的组合进行MERGE。
  4. 记住,未绑定的关系也会被创建。
  5. 在MERGE之后使用ON MATCH和ON CREATE来根据MERGE行为设置属性。
  6. MERGE在创建模式时获取模式中节点和关系上的锁。
  7. 出于 性能原因 ,强烈建议在使用MERGE时在标签或属性创建模式索引schema index

帮助

您可以使用help命令显示有关特定子句的更多信息。例如,执行以下命令可以了解match子句的更多信息:

:help match

您应该看到以下界面:

你甚至可以这样调用它来显示可用子句的列表:

:help cypher

下面的界面将显示在Neo4j浏览器中。


标题:Neo4j Cypher 语言基础
作者:michael
地址:https://blog.junxworks.cn/articles/2024/10/25/1729825690481.html