版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/79850412
图数据库常规的有:neo4j(支持超多语言)、JanusGraph/Titan(分布式)、Orientdb,google也开源了图数据库Cayley(Go语言构成)、PostgreSQL存储RDF格式数据。
—- 目前的几篇相关:—–
neo4j︱图数据库基本概念、操作罗列与整理(一)
neo4j︱Cypher 查询语言简单案例(二)
neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)
neo4j系列第二篇,一个简单的demo案例,从构建-基本内容查询。
一、三要素:节点、关系、模式
1.1 节点
基本用法:
代码语言:javascript复制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”})。 注意:节点标签、关系类型和属性名称区分大小写。
其中节点之间用:’–>’,包含关系的可以用’->’
1.2 关系
有以下几种关系型写法:
代码语言:javascript复制-[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个节点
关系表达,cypher语法:
举例:
代码语言:javascript复制MATCH (n1:Label1)-[rel:TYPE]->(n2:Label2)
WHERE rel.property > {value}
RETURN rel.property, type(rel)
1.3 模式 Patterns
其功能为: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中的关键部分,灵活书写模式能帮我们正确获取、实现推测计算等等各种任务。
- friend-of-a-friend (user)-:KNOWS-(friend)-:KNOWS-(foaf)
- shortest path: path = shortestPath( (user)-:KNOWS*..5-(other) )
- collaborative filtering (user)-:PURCHASED->(product)<-:PURCHASED-()-:PURCHASED->(otherProduct)
- tree navigation (root)<-:PARENT*-(leaf:Category)-:ITEM->(data:Product)
比较费解…
.
二、使用案例demo
从0开始构建一个非常小的关系网络结构,来简单应用cypher语言。
来源:GraphGist: First Steps with Cypher by Michael Hunger
1、创建自己’You’的节点
代码语言:javascript复制CREATE (you:Person {name:"You"})
RETURN you
2、创建与自己关系的节点
代码语言:javascript复制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中,变量-变量,可以用’–>’,关系型的指向用’->’
3、批量创建与自己有关的朋友
代码语言:javascript复制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):
代码语言:javascript复制MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )
4、查询你的朋友圈
代码语言:javascript复制match (you {name:'You'})-[:FRIEND]->(yf)
return you,yf
通过关系查询’You’的朋友圈
5、新建朋友圈之外的二度关系
代码语言:javascript复制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’身份。
6、查询:我通过朋友圈的谁来学习neo4j
代码语言:javascript复制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