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