Neo4j图数据库和Cypher入门
Mac终端开启neo4j /usr/local/neo4j-community-4.2.1/bin/neo4j start
图数据库和关系型数据库最本质的区别在于图数据库是a graph database stores connections alongside the data in the model,即存储了节点之间的关系。
四个主要的概念
-
Nodes
在域中识别的第一个实体。节点是构成图形的两个基本单元之一(另一个基本单元是关系)。节点通常用于表示实体,但也可以表示其他域组件,具体取决于用例。节点包含保存数据名称-属性值对。可以使用一个或多个标签为节点分配角色或类型。 -
Labels
标签,用于给节点进行分组或分类。标签是用于将节点分组到集合中的命名的图构造。使用相同标签标记的所有节点都属于同一集合。查询可以使用这些集而不是整个图,从而使查询更易于编写,效率更高。一个节点可以使用任意数量的标签(包括无标签)进行标记。标签是图的可选添加项。 -
Relationships
关系连接两个节点,并允许我们找到相关的数据节点。它有一个源节点和一个显示方向的箭头指向的目标节点。尽管必须在特定的方向上存储关系,但Neo4j在任何方向上都具有相同的遍历性能,因此可以在不指定方向的情况下查询关系。
图形数据库中的一个核心一致性规则是“无断开的链接”,确保现有关系永远不会指向不存在的端点。因为一个关系总是有一个开始和结束节点,你不能删除一个节点而不删除它的关联关系。 -
Properties
属性是可以存储在节点或关系上的数据的名称-值对。属性允许存储有关节点的相关数据或与它所描述的实体的关系。
Cypher语言
CREATE创建 创建节点、关系和属性
MATCH匹配 检索节点、关系和属性
RETURN返回 返回检索结果
WHERE 提供条件过滤检索数据
DELETE 删除 删除节点和关系
REMOVE移除 删除节点和关系属性
ORDER BY以……排序 排序检索数据
SET组 添加或更新标签
MERGE 确保图中已有pattern存在
创建无属性节点
CREATE(<node-name>:<label-name>)
创建有属性节点
CREATE(<node-name>:<label-name>
{
<key>:<value>
…………
<n-key>:<n-value>
}
)
创建多个标签到节点
CREATE(<node-name>:<label-name1>:<label-name2>:……:<label-namen>)
匹配命令
MATCH(<node-name>:<label-name>)
直接执行报错Neo.ClientError.Statement.SyntaxError: Query cannot conclude with MATCH (must be RETURN or an update clause) (line 1, column 1 (offset: 0))原因是MATCH命令需在RETURN或update子句里使用。如:MATCH (e:employee) RETURN e或 MATCH (dept:Dept) RETURN dept.deptno,dept.dname,dept.location
使用新节点创建关系
单向CREATE (e:Employee)-[r:DemoRelation]->(c:Employee)
双向CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee)
使用已知节点创建带属性的关系
MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)
CREATE(<node1-name>)-[<relationship-name>:<relationship-label-name>{<define-properties-list>}]->(<node2-name>)
RETURN <relationship-name>
eg:MATCH (cust:Customer),(cc:CreditCard) CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:“12/12/2014”,price:55000}]->(cc) RETURN r
检索关系节点的详细信息
MATCH (<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-name>)
RETURN <node-label-name>
eg:MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) RETURN cust,cc
WHERE
WHERE<property-name> <comparison-operator> <value>
DELETE 删除节点和关联关系
删除节点 MATCH (e: Employee) DELETE e
删除节点和关系 MATCH (cc: CreditCard)-[rel]-(c:Customer) DELETE cc,c,rel
REMOVE 删除标签和属性
REMOVE <node-name>.<property1-name>,<node-name>.<property2-name>
REMOVE <label-name-list>
Neo4j CQL DELETE和REMOVE命令之间的主要区别 :
DELETE操作用于删除节点和关联关系。
REMOVE操作用于删除标签和属性。
SET 向现有节点或关系添加新属性或更新属性值
SET <node-label-name>.<property1-name>,...<node-laben-name>.<propertyn-name>
eg:MATCH (dc:DebitCard) SET dc.atm_pin = 3456 RETURN dc
WITH将变量传递至下一个语句使其可用
MERGE
merge 确保graph中有pattern存在,不管是已经存在还是需要被创建;
与ON CREATE或ON MATCH联合使用,在查询语句中对节点的属性或关系进行改变;
也需要return语句。
Merge single node with a label
MERGE (robert:Critic)
RETURN robert, labels(robert)
Merge single node with properties
MERGE (charlie { name: 'Charlie Sheen', age: 10 }) RETURN Charlie
Merge single node specifying both label and property
MERGE (michael:Person { name: 'Michael Douglas' }) RETURN michael.name, michael.bornIn
Merge single node derived from an existing node property
合并从现有节点属性派生的单个节点,对一组节点中每个节点的属性p,基于p的特定值创建一个新的节点。
MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city
Merge with ON CREATE
Merge a node and set properties if the node needs to be created.
MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created
Merge with ON MATCH
Merging nodes and setting properties on found nodes.
MERGE (person:Person)
ON MATCH SET person.found = TRUE RETURN person.name, person.found
The query finds all the Person nodes, sets a property on them, and returns them.