Cypher图数据库

openCypher

Neo4j的图形查询语言称为Cypher,非常适合用于查找模式。与SQL不同,它不依赖于编写复杂的连接
在Cypher中,可以使用ascii-art表示在Import和Explore中看到的图形模式。

opencrypher是Cypher®的开源实现,Cypher®是最广泛采用的、完全指定的、开放的属性图数据库查询语言。Cypher是由Neo4j开发的。
在这里插入图片描述
GQL是继SQL之后的第一个ISO/IEC国际标准数据库语言项目。GQL代表“图形查询语言”。新语言将由负责SQL标准的国际工作组开发和维护。GQL大量利用现有语言。
sql 生成表, GQL 生成图。

什么是graph(图形)?
图形数据库存储节点(供应商、产品等)及其关系(例如供应商供应产品)。
其他类型的数据库可能使用表和文档,但在图形中,数据的存储方式与您在白板上勾画想法的方式相同。
在这里插入图片描述
在关系数据库中,通常需要向查询添加显式连接。在这样做的过程中,关系是在运行时计算的,这可能是一个昂贵且缓慢的操作。在存储关系的图中,许多功能强大的操作更快、更简单。
在关系数据库中,必须定义模式(数据的结构)。在图中,您的数据不受预定义模式的限制而得到管理。这允许在考虑数据和发展数据时具有更大的灵活性

Nodes, properties, relationships
图中的节点和关系可以具有类型和属性。
Nodes and properties
节点可以用标签来标记,代表它们在数据集中的不同角色(例如供应商、雇员、客户)。它们也可以有任意数量的键值对作为属性(例如name:“Camembert Pierrot”)。
Relationships
关系在两个节点实体之间提供定向的、类型的或属性的连接(例如Shipper SHIPS Order)。
关系总是有方向、类型、开始节点和结束节点。它们也可以有属性,就像节点一样
节点可以拥有任意数量的关系,而不会牺牲性能。
虽然关系总是有方向的,但它们可以在任何方向上有效地导航。在本例中,您可以查找发送订单的人,也可以反向查找发送了哪些订单。
Re-imagining a classic (Northwind)
一个class Northwind数据集代表一个在线商店。
下面的按钮允许您一次单击加载数据集和数据模型,以方便您获取 Northwind dataset;
在这里插入图片描述

现在要将这个关系数据库转换为图形数据库。
在这里插入图片描述
您可以看到来自Northwind表的CSV文件表示为图形模型。这些文件的映射已经为您准备好了。
注意连接节点的关系,例如,客户购买了订单,而订单订购了产品。

对于模型中的每个节点和关系,您可以看到CSV文件的哪些部分映射到哪些属性。

原始连接表或外键中的源id和目标id用于创建连接节点的关系。
该模型是交互式的;您可以单击并探索其节点和关系

该查询查找客户订购的所有产品及其供应商。

MATCH path=(c:Customer)-[:PURCHASED]->()-[:ORDERS]->(:Product)<-[:SUPPLIES]-(:Supplier)
WHERE c.companyName = 'Blauer See Delikatessen'
RETURN path;

在这里插入图片描述

查看每个客户订购了农产品类别中的产品数量。

MATCH (cust:Customer)-[:PURCHASED]->(:Order)-[o:ORDERS]->(p:Product),
      (p)-[:PART_OF]->(c:Category {categoryName:'Produce'})
RETURN cust.contactName as CustomerName,
       sum(o.quantity) AS TotalProductsPurchased

在这里插入图片描述

Read Query

## Read Query Structure
[USE]
[MATCH [WHERE]]
[OPTIONAL MATCH [WHERE]]
[WITH [ORDER BY] [SKIP] [LIMIT] [WHERE]]
RETURN [ORDER BY] [SKIP] [LIMIT]

MATCH

匹配并返回所有节点:

MATCH (n)
RETURN n AS NODE;

将所有Person节点与连接到Car节点的own关系匹配,并返回carOwners的名称。

MATCH (n:Person) - [:OWNS] -> (:Car)
RETURN n.name AS carOwners

将路径模式绑定到路径变量,并返回路径模式。

MATCH p=( :Person) - [ :OWNS] -> ( :Car )
RETURN p AS path

OPTION MATCH

OPTION MATCH与图数据库匹配模式,就像MATCH一样。不同之处在于,如果没有找到匹配,OPTIONAL MATCH将对模式的缺失部分使用null。

OPTION MATCH (n:Person) - [r] -> (m:Person {name: 'Alice'})
RETURN n, r, m

应该使用MATCH来查找必须出现在模式中的实体。应该使用OPTIONAL MATCH来查找模式中可能不存在的实体。

MATCH (n:Person {name: 'Neo'})
OPTIONAL MATCH (n)-[r]->(m {name: 'Alice'})
RETURN n, r, m

WHERE

WHERE可以出现在MATCH或OPTIONAL MATCH子句中。它还可以过滤WITH子句的结果。

MATCH (n:Label)-->(m:Label)
WHERE n.property <> $value
RETURN n, m

如下图所示为匹配Customer 中 companyName = ‘Blauer See Delikatessen’的返回结果
在这里插入图片描述
标签表达式可以用作WHERE子句中的判断。

MATCH (n)
WHERE n:A|B
RETURN n.name AS name

关系类型表达式可以用作WHERE子句中的判断。

MATCH (n:Label)-[r]->(m:Label)
WHERE r:R1|R2
RETURN r.name AS name

WHERE可以出现在MATCH子句中。

WITH 30 AS minAge
MATCH (a:Person WHERE a.name = 'Andy')-[:KNOWS]->(b:Person WHERE b.age > minAge)
RETURN b.name

WHERE可以出现在模式推导语句中。

MATCH (a:Person {name: 'Andy'})
RETURN [(a)-->(b WHERE b:Person) | b.name] AS friends

关系类型表达式可以用作WHERE子句中的判断。

WITH 2000 AS minYear
MATCH (a:Person)-[r:KNOWS WHERE r.since < minYear]->(b:Person)
RETURN r.since

关系模式判断可以在模式包含中使用。

WITH 2000 AS minYear
MATCH (a:Person {name: 'Andy'})
RETURN [(a)-[r:KNOWS WHERE r.since < minYear]->(b:Person) | r.since] AS years

RETURN

返回所有变量的值。

MATCH (n:Label)-[r]->(m:Label)
RETURN *

使用别名作为结果列名。

MATCH (n:Label)-[r]->(m:Label)
RETURN n AS node, r AS rel

返回唯一的行。

MATCH (n:Person)-[r:KNOWS]-(m:Person)
RETURN DISTINCT n AS node

对结果进行排序。默认顺序为自增。

MATCH (n:Label)-[r]->(m:Label)
RETURN n AS node, r AS rel
ORDER BY n.name

按降序对结果排序。

MATCH (n:Label)-[r]->(m:Label)
RETURN n AS node, r AS rel
ORDER BY n.name DESC

对于结果集,跳过前10行。

MATCH (n:Label)-[r]->(m:Label)
RETURN n AS node, r AS rel
SKIP 10

将结果集的行数限制为最多10行。

MATCH (n:Label)-[r]->(m:Label)
RETURN n AS node, r AS rel
LIMIT 10

匹配行的数目

MATCH (n:Label)-[r]->(m:Label)
RETURN count(*) AS nbr

标签表达式可以在WITH或RETURN语句中使用。

MATCH (n:Label)-[r]->(m:Label)
RETURN r:R1|R2 AS result

关系类型表达式可以用作WITH或RETURN语句中的判断

MATCH (n:Label)-[r]->(m:Label)
RETURN r:R1|R2 AS result

WITH

WITH语法类似于RETURN。它显式地分隔查询部分,允许用户声明将哪些变量传递到查询的下一部分。

MATCH (user)-[:FRIEND]-(friend)
WHERE user.name = $name
WITH user, count(friend) AS friends
WHERE friends > 10
RETURN user

WITH子句可以使用ORDER BY 、 SKIP、LIMIET、WHERE

MATCH (user)-[:FRIEND]-(friend)
WITH user, count(friend) AS friends
ORDER BY friends DESC
SKIP 1
LIMIT 3
WHERE friends > 10
RETURN user

UNION

返回所有查询结果的不同联合。结果列类型和名称必须匹配。

MATCH (a:Person)-[:KNOWS]->(b:Person)
RETURN b.name AS name
UNION
MATCH (a:Person)-[:LOVES]->(b:Person)
RETURN b.name AS name

返回所有查询结果的联合,包括重复的行

MATCH (a:Person)-[:KNOWS]->(b:Person)
RETURN b.name AS name
UNION ALL
MATCH (a:Person)-[:LOVES]->(b:Person)
RETURN b.name AS name

Write Query

# Write-Only Query Structure
[USE]
[MATCH [WHERE]]
[OPTIONAL MATCH [WHERE]]
[WITH [ORDER BY] [SKIP] [LIMIT] [WHERE]]
[CREATE]
[MERGE [ON CREATE ...] [ON MATCH ...]]
[WITH [ORDER BY] [SKIP] [LIMIT] [WHERE]]
[SET]
[DELETE]
[REMOVE]
[RETURN [ORDER BY] [SKIP] [LIMIT]]
# Read-Write Query Structure
[USE]
[MATCH [WHERE]]
[OPTIONAL MATCH [WHERE]]
[WITH [ORDER BY] [SKIP] [LIMIT] [WHERE]]
[CREATE]
[MERGE [ON CREATE ...] [ON MATCH ...]]
[WITH [ORDER BY] [SKIP] [LIMIT] [WHERE]]
[SET]
[DELETE]
[REMOVE]
[RETURN [ORDER BY] [SKIP] [LIMIT]]

Create

使用给定的标签和属性创建节点

CREATE (n:Label {name: $vale});
CREATE (n:Label $map);

创建一个具有给定关系类型和方向的关系;给它绑定一个变量r。

CREATE (n:Label)-[r:TYPE]->(m:Label)

创建具有给定类型、方向和属性的关系。

CREATE (n:Label)-[:TYPE {name: $value}]->(m:Label)

SET

更新或创建属性

SET e.property1 = $value1

更新或创建多个属性。

SET
  e.property1 = $value1,
  e.property2 = $value2

设置所有属性。这将删除所有现有的属性。

SET e = $map

使用空Map({}),删除所有现有属性

SET e = {}

添加和更新属性,同时保留现有属性。

SET e += $map

为节点添加标签。本例将标签Person添加到节点。

MATCH (n:Label)
WHERE n.id = 123
SET n:Person

MERGE

匹配一个模式,或者创建一个不存在的模式。对条件更新使用ON CREATE和ON MATCH。

MERGE (n:Label {name: $value})
ON CREATE SET n.created = timestamp()
ON MATCH SET
  n.counter = coalesce(n.counter, 0) + 1,
  n.accessTime = timestamp()

MERGE查找或创建节点之间的关系。

MATCH
  (a:Person {name: $value1}),
  (b:Person {name: $value2})
MERGE (a)-[r:LOVES]->(b)

MERGE查找或创建附加到节点的路径。

MATCH (a:Person {name: $value1})

DELETE

删除关系。

MATCH (n:Label)-[r]->(m:Label)
WHERE r.id = 123
DELETE r

删除所有关系。

MATCH ()-[r]->()
DELETE r

删除节点及其连接的所有关系。

MATCH (n:Label)
WHERE n.id = 123
DETACH DELETE n

删除节点和关系。如果给定节点附加到多个关系,将抛出错误。

MATCH (n:Label)-[r]-()
WHERE r.id = 123 AND n.id = 'abc'
DELETE n, r

删除一个关系,并在删除后返回每个节点的关系数。

MATCH (n1:Label)-[r {id: 123}]->(n2:Label)
CALL {
  WITH n1 MATCH (n1)-[r1]-()
  RETURN count(r1) AS rels1
}
CALL {
  WITH n2 MATCH (n2)-[r2]-()
  RETURN count(r2) AS rels2
}
DELETE r
RETURN
  n1.name AS node1, rels1 - 1 AS relationships1,
  n2.name AS node2, rels2 - 1 AS relationships2

从数据库中删除所有节点和关系。

MATCH (n)
DETACH DELETE n

REMOVE

移除节点上的标签。

MATCH (n:Label)
WHERE n.id = 123
REMOVE n:Label

从节点中删除属性。

MATCH (n:Label)
WHERE n.id = 123
REMOVE n.alias

不能使用REMOVE从节点或关系中删除所有现有属性。通过使用带有属性替换操作符(=)和空映射({})作为右操作数的SET子句,可以从节点或关系中删除所有现有的属性。

MATCH (n:Label)
WHERE n.id = 123
SET n = {} # REMOVE ALL properties
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据库是一种特殊的数据库,它使用形结构来存储和表示数据。Python中有许多数据库可供选择,其中一些是: 1. Neo4j:Neo4j是一个流行的数据库,它使用Cypher查询语言来查询和操作数据。它还有一个Python驱动程序,可以轻松地将Neo4j集成到Python应用程序中。 2. ArangoDB:ArangoDB是一个多模型数据库,支持形、文档和键值存储。它有一个Python驱动程序,可以使用Python轻松地查询和操作数据。 3. OrientDB:OrientDB是一个面向对象的数据库,支持形、文档和键值存储。它有一个Python驱动程序,可以使用Python轻松地查询和操作数据。 下面是一个使用Python和Neo4j的简单示例,用于创建一个形并添加节点和关系: ```python from neo4j import GraphDatabase # 连接到Neo4j数据库 uri = "bolt://localhost:7687" driver = GraphDatabase.driver(uri, auth=("neo4j", "password")) # 创建一个会话 with driver.session() as session: # 创建一个节点 session.run("CREATE (:Person {name: 'Alice', age: 30})") # 创建另一个节点 session.run("CREATE (:Person {name: 'Bob', age: 25})") # 创建一个关系 session.run("MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}) " "CREATE (a)-[:KNOWS]->(b)") # 查询数据 result = session.run("MATCH (a:Person)-[:KNOWS]->(b:Person) " "RETURN a.name, b.name") # 输出结果 for record in result: print(record["a.name"], "knows", record["b.name"]) # 关闭连接 driver.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会灭火的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值