文章目录
JanusGraph
什么是图数据库
有别于关系型数据库,是NoSQL数据库的一种,应用图形理论存储实体之间的关系信息。
什么是Janusgraph,JanusGraph能干什么
【Janusgraph官网 https://docs.janusgraph.org/getting-started/architecture/】
JanusGraph是一个图形数据库引擎。JanusGraph本身专注于紧凑的图形序列化,丰富的图形数据建模和有效的查询执行。此外,JanusGraph利用Hadoop进行图分析和批处理图处理。
JanusGraph旨在支持当需要的存储和计算能力超出了单台计算机所能提供的范围的图处理。 包括对图数据进行实时遍历和分析查询,这是JanusGraph的基本优势。
Janusgraph和磁盘之间需要一个或多个存储和索引适配器,来对磁盘进行操作。
存储可用适配器:
- Cassandra
- HBase
- Berkeley
索引:
- ES
- Solr
- Luncene
优势
- 可以存储大图,比如包含数千亿顶点和边的图
- 分布式部署,支持集群
- 集群节点支持线性扩展
- 支持很多并发事务和操作图处理,处理能力随集群机器数量变化,毫秒级应答大型图上的复杂遍历查询
- 通过hadoop支持全局图分析和批处理
- 数据分布式存储,每份数据有多个副本
- 支持多个数据中心做高可用,支持热备份
- 支持后端存储系统,标准支持四种【Cassandra,HBase,Cloud Bigtable,BrekeleyDB】,也可增加第三方的存储系统
- 支持geo
- 集成ES,Solr,Lucene等后可以支持全文搜索
- 可视化存储
架构信息
Vertex【顶点】
代表每个实体,可以存在不同的property。
Edge【边/关系】
用于描述顶点之间的关系,可以存在不同的property。
不存在无向边,双向边使用两个方向相反的边表示。
- 边的类型
【MULTI】 允许在任意一对顶点之间使用同一标签的多个边。
【SINGLE】任意一对顶点之间最多存在一条这样的边.
【MANY2ONE】 多对一,对于某一顶点,只能有一条该标签的输出边,可以有多条输入边。如标签mother,因为每个人最多有一个母亲,但母亲可以有多个孩子。所以对于顶点A,输出的mother边只能有一条,但是输入边可以有多条。
【ONE2MANY】 一对多,对于某一顶点,可以有多条输出边,但是只能有一条该标签的输入边。如winnerOf,因为每个竞赛最多由一个人赢得,但一个人可以赢得多个竞赛。
【ONE2ONE】一对一,对于任何顶点上最多只有一条该标签的输入与输出边。如婚姻关系。与SINGLE的不同是ONE2ONE关系是相互的。
property【属性】
用于描述顶点和边的属性,但是属性键名必须是唯一的不能重复。
无论是边还是顶点都可以有属性键
如: 人是一个顶点,这个顶点可以有姓名属性
朋友关系是一条边,这条边可以有好友关系强度属性
-
属性数据类型
String
Character
Boolean
Byte
Short
Integer
Long
Float
Double
Date
Geoshape
UUID -
数据属性集合类型
SINGLE 只允许存在一个值。如生日
LIST 可以存在任意数量的值。如多组交易数据
SET 允许多个值,但不能重复。如曾用名
schema【数据模型】
schema由edge labels【边标签】 , property keys【属性键】 和 vertex labels【顶点标签】组成
- 自动创建Schema
如果没有明确定义边标签,属性键或顶点标签,则在添加边,顶点或属性设置期间首次使用时,将隐式定义边标签,属性键或顶点标签。DefaultSchemaMaker配置用于JanusGraph图定义这样的类型。
默认情况下,隐式创建的边标签具有多样性MULTI,隐式创建的属性键具有基数SINGLE和数据类型Object.class。用户可以通过实现和注册他们自己的DefaultSchemaMaker来控制schema元素的自动创建。
强烈建议通过schema.default=none在JanusGraph图形配置中进行设置,明确定义所有schema元素并禁用自动schema创建
JanusGraph怎么用
安装
环境要求:
Java 8 SE
启动服务
./bin/janusgraph.sh start
两种连接和使用janusGraph方式
- 通过导入jar包到客户端程序中,客户端为其提供执行线程。
- JanusGraph提供了一个长时间运行的服务器进程【JanusGraph Server】,客户端可以将查询条件传递给该服务器,由该服务器执行。
API
基础操作
V()、E()、id()、label()、properties()、valueMap()、values()
- V():查询顶点,一般作为图查询的第1步,后面可以续接的语句种类繁多。例:g.V(),g.V(‘v_id’),查询图中所有顶点和特定点;
- E():查询边,一般作为图查询的第1步,后面可以续接的语句种类繁多 例:g.E(),g.E(‘S3:TinkerPop>4>>S4:Gremlin’);
- id():获取顶点、边的id。例:g.V().id(),查询所有顶点的id;
- label():获取顶点、边的 label。例:g.V().label(),可查询所有顶点的label。
- key() / value():获取属性的key/value的值。例:g.V().peoperites().key(), g.V().properties().value()//获取所有定点的key/value值
- properties():获取顶点、边的属性;可以和 key()、value()搭配使用,以获取属性的名称或值。例:g.V().properties(‘name’),查询所有顶点的 name 属性,若无name属性则调过。g.V().properties().key(),查询所有顶点属性名称;
- valueMap():获取顶点、边的属性,以Map的形式体现,和properties()比较像
- values():获取顶点、边的属性值。例,g.V().values() 等于 g.V().properties().value()
遍历操作
out()、in()、both()、outE()、inE()、bothE()、outV()、inV()、bothV()、otherV()
-
以顶点为基础
- out(label):根据指定的 Edge Label 来访问顶点的 OUT 方向邻接点(可以是零个 Edge Label,代表所有类型边;也可以一个或多个 Edge Label,代表任意给定 Edge Label 的边,下同);
- in(label):根据指定的 Edge Label 来访问顶点的 IN 方向邻接点;
- both(label):根据指定的 Edge Label 来访问顶点的双向邻接点;
- outE(label): 根据指定的 Edge Label 来访问顶点的 OUT 方向邻接边;
- inE(label):根据指定的 Edge Label 来访问顶点的 IN 方向邻接边;
- bothE(label):根据指定的 Edge Label 来访问顶点的双向邻接边;
-
以边为基础
- outV():访问边的出顶点,出顶点是指边的起始顶点;
- inV():访问边的入顶点,入顶点是指边的目标顶点,也就是箭头指向的顶点;
- bothV():访问边的双向顶点;
- otherV():访问边的伙伴顶点,即相对于基准顶点而言的另一端的顶点;
has过滤条件
- hasLabel(labels…)、hasId(ids…)、has(key, value)、has(lab