Neo4j Cypher 语言基础
Cypher 语言基础
Cypher 查询的基本结构通常包含以下几个部分:
- =MATCH= :指定要查询的图模式。
- =WHERE= :提供条件过滤,以限制返回的结果。
- =RETURN= :定义应该返回哪些数据。
- =其他子句= :如
CREATE
,MERGE
,SET
,DELETE
等,用于修改图形数据。
示例查询
以下是一些基本的 Cypher 查询示例:
- =查找所有节点= :
cypherCopy CodeMATCH (n) RETURN n
- =查找特定类型的所有节点= :
cypherCopy CodeMATCH (n:Person) RETURN n
- =查找具有特定属性的节点= :
cypherCopy CodeMATCH (n:Person {name: 'Alice'}) RETURN n
- =查找两个节点之间的关系= :
cypherCopy CodeMATCH (a:Person)-[r]->(b:Person) RETURN a, r, b
- =创建新节点和关系= :
cypherCopy CodeCREATE (a:Person {name: 'Alice'}) CREATE (b:Person {name: 'Bob'}) CREATE (a)-[r:FRIEND]->(b) RETURN a, r, b
- =更新节点属性= :
cypherCopy CodeMATCH (n:Person {name: 'Alice'}) SET n.age = 30 RETURN n
- =删除节点和关系= :
cypherCopy CodeMATCH (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子句时,请记住以下几点:
- 没有绑定变量的MERGE会创建重复的元素。
- 带有绑定变量的MERGE重用现有的图元素。
- 对不同的用例使用绑定和未绑定变量的组合进行MERGE。
- 记住,未绑定的关系也会被创建。
- 在MERGE之后使用ON MATCH和ON CREATE来根据MERGE行为设置属性。
- MERGE在创建模式时获取模式中节点和关系上的锁。
- 出于 性能原因 ,强烈建议在使用MERGE时在标签或属性上创建模式索引schema index。
帮助
您可以使用help命令显示有关特定子句的更多信息。例如,执行以下命令可以了解match子句的更多信息:
:help match
您应该看到以下界面:
你甚至可以这样调用它来显示可用子句的列表:
:help cypher
下面的界面将显示在Neo4j浏览器中。