CQL代表Cypher查询语言。

  在Neo4j-browser(浏览器)中输入命令时,如果需要回车,使用Shift+Enter进行输入。

  在Cypher中单引号和双引号都可以表示字符串(这点和Python相同)。

1. MATCH

1.1 MATCH语法

MATCH相当于SQL SELECT

MATCH
(node)-[relationship]->(node)
WHERE
(node | relationship)
RETURN
(node | relationship)

1.2 MATCH语句实例

例一:

MATCH (n:Person)
RETURN n limit 1000

其中n是别名,相当于SQL中的AS。

例二,带有关系的查询:

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
RETURN n,p limit 10

例三,限制条件下带有关系的查询:

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)
WHERE n.name = "姓名6"
RETURN n,p limit 10

1.3 多维度关系查询

MATCH (n:Person)-[:HAS_PHONE]->(p:Phone)-[:CALL]->(p1:Phone)
WHERE n.name = "姓名6"
RETURN n,p,p1 limit 10

1.4 不限制实体的关系查询

MATCH p=()-[c:CALL]-()
RETURN p limit 10
MATCH p=()-[c:CALL]->()
RETURN p limit 10

如果不加limit 10,两者结果是相同的。

Neo4j Cypher总结_最短路径

Neo4j Cypher总结_最短路径_02

1.5 带有正则表达式的查询

MATCH (n:USERS)
WHERE n.name=~'Jack.*'
RETURN n

1.6 包含查询

MATCH (n:USERS)
WHERE n.name contains ‘J’
RETURN n

2. CREATE

  创建实体和关系。

2.1 CREATE语句实例

例一:

CREATE (n:Person)-[:LOVES]->(m:Dog)

例二,带有属性的创建:

CREATE (n:Person{name:"李四"})-[:FEARS{level:1}]->(t:Tiger{type:"东北虎"})

2.2 给没有关系的实体创建关系

  1. 创建实体
CREATE (n:Person{name:'王五'})
CREATE (n:Person{name:'赵六'})
  1. 创建关系,具体内容为创建一个关系k,使得name=“王五”的Person与name:"赵六"的Person有KNOW的关系
MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
CREATE (n)-[k:KNOW]->(m)
RETURN k
  1. 查询验证(此步可有可无)
MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
RETURN n,m

3. MERGE

MERGE和CREATE的操作比较类似,区别在于哪里呢?为了便于理解,我们以Python的例子为例,假设数据存放在list中,CREATE相当于直接append,而MERGE相当于先find,如果存在则pass,如果不存在则CREATE。

MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
CREATE (n)-[l:LOVE]->(m)
RETURN l
MATCH (n:Person{name:'王五'}), (m:Person{name:'赵六'})
RETURN n,m

4. DELETE

4.1 删除实体之间的关系

MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
DELETE f

4.2 删除实体

MATCH (n:Person{name:'李四'})
DELETE n

4.3 同时删除实体和关系

MATCH (n:Person{name:'李四'})-[f:FEAR]->(t:Tiger)
DELETE n,f,t

5. SET

向现有节点或关系添加新标签或者属性。

5.1 添加实体标签

MATCH (t:Tiger)
WHERE ID(t)=1637
SET t:A

这时候会对该实体添加一个实体标签A。

5.2 修改、更新实体的属性

修改属性

MATCH (t:Tiger)
WHERE ID(t)=1637
SET t.type='老虎'

添加属性

MATCH (t:Tiger)
WHERE ID(t)=1637
SET t.name='阿虎'

6. 索引

6.1 添加索引

语法为:CREATE INDEX ON :<label_name> (<property_name>)

CREATE INDEX ON:Person(name)

6.2 删除索引

语法为:DROP INDEX ON :<label_name> (<property_name>)

DROP INDEX ON:Person(name)

6.3 添加唯一索引

语法为:CREATE CONSTRAINT ON (<label_name>)

ASSERT <property_name> IS UNIQUE

CREATE CONSTRAINT ON (p:Person)
ASSERT p.number IS UNIQUE

6.4 删除唯一索引

语法为:DROP CONSTRAINT ON (<label_name>)

ASSERT <property_name> IS UNIQUE

DROP CONSTRAINT ON (p:Person)
ASSERT p.number IS UNIQUE

7. 复杂查询

姓名12的三度关系内的朋友有哪些

MATCH (p1:Person)-[:FRIEND_OF]-(p2:Person)-[:FRIEND_OF]-(p3:Person)
WHERE p1.name='姓名12'
RETURN p1,p2,p3

姓名12的三度关系内的人有哪些

MATCH (p1:Person)-[]-(p2:Person)-[]-(p3:Person)
WHERE p1.name='姓名12'
RETURN p1,p2,p3

姓名11的通话记录中的电话有哪些

MATCH (n:Person)-[:HAS_PHONE]->(p1:Phone)-[:CALL]-(p2:Phone)
WHERE n.name='姓名11'
RETURN n,p1,p2

8. 最短路径查询

得到最短路径中的一个:

MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
p=SHORTESTPATH((p1)-[*..10]-(p2))
RETURN p

这里[*…10]表示路径深度10以内查找所有存在的关系中的最短路径关系。

得到所有最短路径:

MATCH (p1:Person{name:"姓名2"}),(p2:Person{name:"姓名10"}),
p=ALLSHORTESTPATHS((p1)-[*..10]-(p2))
RETURN p