Cypher 查询语言

1. create graph

1.1 create graph

CREATE GRAPH graphName;
SET graph_path = graphName;

1.2 Create Labels

CREATE VLABEL vlabelName;
CREATE ELABEL elabelName;

CREATE VLABEL childVlabelName inherits (parentVlabelName);
CREATE ELABEL childElabelName inherits (parentElabelName1, parentElabelName2);

inherits是继承不同的label的命令。在生成label的时候,在子女label的名字之后,如果将“父母label”的名字命名,就可以继承其他的label。

1.3 Create vertices、 edges and path


CREATE ( );
CREATE (:person);
CREATE (:person {name: 'Edward'});
CREATE (:person {name: 'Alice', age: 20});
CREATE (a {name:'Alice'}), (b {name:a.name});

-- create path
CREATE (:person {name: 'Emily'})-[:knows]->(:person {name: 'Tom'});

MATCH (E:person {name: 'Edward'}), (A:person {name: 'Alice'})
CREATE (E)-[:likes]->(A);

MATCH (E:person {name: 'Edward'}), (A:person {name: 'Alice'})
CREATE (E)-[:likes {why: 'She is lovely'}]->(A);

MATCH (E:person {name: 'Edward'})
CREATE (E)-[:IS_PROUD_OF]->(E);

1.4 merge

  • 如果merge的pattern存在则跟match一样输出,如果不存在则创建; merge 将pattern作为一个整体来看待 , 参看 1.5 Unique Constraint
MERGE (E:person {name: 'Edward'})-[L:likes]->(A:person {name: 'Alice'})
RETURN E, L, A;

MERGE (E:person {name: 'Edward'})
MERGE (A:person {name: 'Alice'})
MERGE (E)-[L:likes]->(A)
RETURN E, L, A;

1.5 Unique Constraint

CREATE CONSTRAINT ON person ASSERT name IS UNIQUE;

MERGE (m:person {name: 'Michael'}) //SUCCESS
MERGE (b:person {name: 'Bella'}) //SUCCESS
MERGE (m:person {name: 'Michael'})-[:likes]->(b:person {name: 'Bella'}) //FAIL

1.6 set

用于追加、设置、去除属性

-- 追加
MATCH (E:person {name: 'Edward'})
SET E.habit = 'play the guitar';

-- 修改
MATCH (E:person {name: 'Edward'})
SET E.name = 'Edward Williams';

-- 删除
MATCH (E:person {name: 'Edward'})
SET E.hobby = NULL;

1.7 删除

MATCH (m:person {name: 'Michael'})-[l:likes]->(b:person {name: 'Bella'})
DELETE l;

MATCH (m:person {name: 'Michael'})
DELETE m;

-- 级联删除顶点和边
MATCH (m:person {name: 'Michael'})
DETACH DELETE m;

2. Querying Graph

2.1 关键字描述

符号描述
()、(:person)、(v)、(var)、(v:person)、({name: 'Jack'})、(v:person {name: 'Jack', age: 24})顶点、标签、变量、属性,如果具体的顶点用()来匹配所有顶点
-[]- 、 -[]-> 、<-[]-无条件制约的边、带有方向的边
-[:knows]-> 、-[e]->、-[e:likes]->、-[{why: 'She is lovely'}]->、-[:likes {why: 'She is lovely'}]->、-[e:likes {why: 'She is lovely'}]->带条件约束的边
[*n]、[*m..n]n度关系、按顺序最少m度关系最多n度关系

2.2 简单的顶点关系描述

2.2.1 路径骨架
()-[]->()

(jack:person {name: 'Jack'})-[k:knows]->(emily:person {name: 'Emily'})
2.2.2 指定顶点边的路径
p = (:person)-[:knows]->(:person)
2.2.3 关系度的描述
(a)-[]->( )-[]->(c)
(a)-[*2]->(c)

(a)-[]->( )-[]->( )-[]->(d)
(a)-[*3]->(d)

(a)-[]->( )-[]->( )-[]->( )-[]->(e)
(a)-[*4]->(e)

(a)-[*2..]->(b)
(a)-[*..7]->(b)
(a)-[*3..5]->(b)
(a)-[*]->(b)
2.2.4 return子句
-- 返回顶点
MATCH (j {name: 'Jack'}) RETURN j;

-- 返回边
MATCH (j {name: 'Jack'})-[k:knows]->(e) RETURN k;

-- 返回Property
MATCH (j {name: 'Jack'}) RETURN j.age;

-- 返回all
MATCH (j {name: 'Jack'})-[k:knows]->(e) RETURN *;

-- 返回path
MATCH p=(j {name: 'Jack'})-[k:knows]->(e) RETURN p;

-- 返回alians
MATCH (j {name: 'Jack'}) RETURN j.age AS HisAge;

-- 返回function
MATCH (j {name: 'Jack'})-[k:knows]->(e) RETURN id(k), roperties(k);
MATCH p=(j {name: 'Jack'})-[k:knows]->(e) RETURN length(p), nodes(p), edges(p);
MATCH (a) RETURN count(a);

2.2.5 order by 子句
MATCH (a:person)
RETURN a.name AS NAME, a.age AS AGE
ORDER BY NAME, AGE;

MATCH (a:person)
RETURN a.name AS NAME, a.age AS AGE
ORDER BY NAME DESC, AGE;
2.2.6 limit 子句
MATCH (a) RETURN a.name LIMIT 10;
2.2.7 skip 子句
  • 用于变更开始顶点的关键字,类似offset
MATCH (a)
RETURN a.name
SKIP 3;
2.2.8 whith
  • 类似通道用于传值
MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
RETURN other, count(common);

WHERE count(common) > 1
RETURN other;

=>

MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
WITH other, count(common) AS cnt
WHERE cnt > 1
RETURN other;

  • Partitioning

没看懂

MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
RETURN other, count(common)
ORDER BY other.name
LIMIT 10;

WHERE count(common) > 1
RETURN other;

MATCH (j:person {name:'Jack'})-[:knows]->(common:person)<-[:knows]-(other:person)
WITH other, count(common) AS cnt
ORDER BY other.name
LIMIT 10
WHERE cnt > 1
RETURN other;
2.2.9 union

union合并多个结果集不去重,union all 去重

MATCH (a:person)
WHERE 20 < a.age::int
RETURN a.name AS name
UNION
MATCH (b:person)
WHERE b.age::int < 50
RETURN b.name AS name;

MATCH (a:person)
WHERE 20 < a.age::int
RETURN a.name AS name
UNION ALL
MATCH (b:person)
WHERE b.age::int < 50
RETURN b.name AS name;

2.2.10 match

需要实际测试

MATCH (j:person {name: 'Jack'})-[:knows]->(v:person)
MATCH (e:person {name: 'Emily'})-[:knows]->(v)
RETURN v.name;

=>

MATCH (j:person {name: 'Jack'})-[:knows]->(v:person),(e:person {name: 'Emily'})-[:knows]->(v)
RETURN v.name;

=>

MATCH (j:person {name: 'Jack'})-[:knows]->(v:person)<-[:knows]-(e:person {name: 'Emily'})
RETURN v.name;
2.2.11 optional match

当match结果为空时返回null,其它功能跟match一致

2.2.12 match only
2.2.13 where

2.3 sql、cypher 组合查询

2.3.1 Cypher in SQL
-- 骨架
SELECT [column_name]
FROM ({table_name|SQLquery|CYPHERquery})
WHERE [column_name operator value];

-- 例子
SELECT n.name
FROM history, (MATCH (n:dev) RETURN n) AS dev
WHERE history.year > n.year::int;

2.3.2 SQL in Cypher
-- 骨架
MATCH [table_name]
WHERE (column_name operator {value|SQLquery|CYPHERquery})
RETURN [column_name];

-- 例子
MATCH (n:dev)
WHERE n.year < to_jsonb((SELECT year FROM history WHERE event = 'AgensGraph'))
RETURN properties(n) AS n;

3. Manipulating Graph

MATCH (v:person {name: 'Jack'})
SET v.age = '24';

公安相关关系挖掘...待后续

  1. 案件和犯罪分子是制造和被制造的关系
  2. 案件和受害人是导致和被导致的关系
  3. 案件和行为是包含属于的关系
  4. 案件和痕迹是包含和属于的关系
  5. 案件和线索是包含属于的关系
  6. 案件和时间是发生的关系
  7. 案件和地点是发生的关系
  8. 犯罪分子和时间是发生的关系
  9. 犯罪疯子和行为是制造和被制造的关系
  10. 犯罪分子和物品是设计和被涉及的关系
  11. 物品和行为是涉及被涉及的关系
  12. 物品和地点是发现被发现的关系

转载于:https://my.oschina.net/ibobby/blog/1615694

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值