图数据库常规的有:neo4j(支持超多语言)、JanusGraph/Titan(分布式)、Orientdb,google也开源了图数据库Cayley(Go语言构成)、PostgreSQL存储RDF格式数据。
—- 目前的几篇相关:—–
neo4j︱图数据库基本概念、操作罗列与整理(一)
neo4j︱Cypher 查询语言简单案例(二)
neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)
neo4j系列第二篇,一个简单的demo案例,从构建-基本内容查询。
基本用法:
MATCH (node:Label) RETURN node.property
MATCH (node1:Label1)-->(node2:Label2)
WHERE node1.propertyA = {value}
RETURN node2.propertyA, node2.propertyB
我们通常用圆括号来包含节点标示符(当然也可以不用)。里面的内容也叫变量,变量不是单指某一个节点,而是服从条件的节点组合。如(p: Person),如果想添加属性:(p: Person {name: “yinglish”})。 注意:节点标签、关系类型和属性名称区分大小写。
其中节点之间用:’–>’,包含关系的可以用’->’
有以下几种关系型写法:
-[rel:KNOWS]-> //单关系,关系的变量名为rel,类型是 KNOWS
(a)-[:KNOWS|:LIKE]->(b) //查询a到b的两类关系
-[{since:2010}]-> //附加属性
-[:KNOWS*..4]-> example: a -[rel: type*minHop..maxHop]-> b
//从a节点到b节点最少可经过minHop、最大可经过maxHop个节点
举例:
MATCH (n1:Label1)-[rel:TYPE]->(n2:Label2)
WHERE rel.property > {value}
RETURN rel.property, type(rel)
其功能为:Patterns can be used to MATCH and CREATE data, but also (evaluating to a list of paths) in expressions, predicates and results.
patterns 模式由一个或多个路径组成,路径间用逗号分隔,一条路径就是一个节点和关系的序列,这个序列指定开始和结束节点,如:(a) –> (b),这条路径开始于a,通过outgoing关系指向b。如果你不在乎具体是哪个节点,不用指定它,只需要用空括号来表示就可以了,如:a –>()–>b。模式是cypher中的关键部分,灵活书写模式能帮我们正确获取、实现推测计算等等各种任务。
比较费解…
.
从0开始构建一个非常小的关系网络结构,来简单应用cypher语言。
来源:GraphGist: First Steps with Cypher by Michael Hunger
CREATE (you:Person {name:"You"})
RETURN you
MATCH (you:Person {name:"You"})
CREATE (you)-[like:LIKE]->(neo:Database {name:"Neo4j" })
RETURN you,like,neo
match到’You’节点之后,新建一条关系,是’You’-‘like’-‘neo4j’。
当create之后,return之后,就会返回三个实体,2个节点+1条关系。
match中,变量-变量,可以用’–>’,关系型的指向用’->’
MATCH (you:Person {name:"You"})
FOREACH (name in ["Johan","Rajesh","Anna","Julia","Andrew"] |
CREATE (you)-[:FRIEND]->(:Person {name:name}))
其中,foreach表示循环,反复create。再来看一个foreach的案例(from:3.3.15. FOREACH):
MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )
match (you {name:'You'})-[:FRIEND]->(yf)
return you,yf
通过关系查询’You’的朋友圈
match (neo:Database {name : 'Neo4j'})
create (anna:Person {name:'Anna'})-[:FRIEND]->(ama:Person:Expert {name:'Amanda'})-[:WORKED_WITH]->(neo)
return neo,anna,ama
创建了’Anna’-‘Amanda’的朋友关系,创建了’Amanda’-‘neo’的工作关系。
同时,定义了’Amanda’的’Expert’身份。
match (you:Person {name:"You"})
match (expert)-[:WORKED_WITH]->(neo:Database {name:'Neo4j'})
match path = shortestPath((you)-[:FRIEND*..5]-(expert))
return path,you,expert,neo
先定位自己you,然后去寻找朋友中谁懂Neo4j:person->neo,然后寻找最短路径的:you-person即可达到目的。
不能用you直接关联neo,而是通过朋友,二度跳转到neo4j。
此时的(expert)->(neo)
值得新手去理解一下,这里expert不是单独指定到某个人,而是指代所有WORKED_WITH neo的人。
Intro to Cypher
GraphGist: First Steps with Cypher