什么是图:
1. 由节点和关系组成
2. 每个节点代表一个实体,每个关系代表两个节点的联系方式。
图数据库:
1. 图数据库就是用图这种数据结构存储和
查询数据的。
2. 与其他关系型数据库或者nosql数据库相比,
图数据库的模型更简单,也更值观。
3. 图数据库更适合用来解决复杂的关系问题,使用图检索的特定语言,可以快速进行图的遍历和关系探查,不需要大量的递归查询和多表联合查询。
图数据库的应用场景:
1. 社交领域:管理社交关系,可以找共同好友,好友推荐等。
2. 零售领域:进行商品推荐。
3. 安全领域:通过风险目标的周边信息,判断存在的风险。
4. 其他:图数据库基本能胜任亿级以上的数据。
从下图中也可以看出,图数据库受欢迎程度增长很快。
几款主流图数据库对比
Hugegraph:
https://hugegraph.github.io/hugegraph-doc/performance/hugegraph-benchmark-0.5.6.html
HugeGraph支持百亿以上的顶点和边快速导入,并提供毫秒级的关联关系查询能力(OLTP), 并可与Hadoop、Spark等大数据平台集成以进行离线分析(OLAP)。
1. 可扩展:支持分布式存储、数据多副本及横向扩容
2. 支持从多数据源批量导入数据(包括本地文件、HDFS文件、MySQL数据库等数据源),支持多种文件格式导入(包括TXT、CSV、JSON等格式)
3. 具备可视化操作界面,可用于操作、分析及展示图
4. 与Hadoop、Spark GraphX等大数据系统集成,支持Bulk Load操作
5. 一定程度上借鉴了Jaunsgraph,增加了很多特性
安装:
Hugegraph-server: 是HugeGraph项目的核心部分,也就是引擎
Hugegraph-loader: 是基于HugeGraph-Client的数据导入工具,将普通文本数据转化为图形的顶点和边并插入图形数据库中;
Hugegraph-staudio: 是HugeGraph的Web可视化工具,可用于执行Gremlin语句及展示图;
安装简单,不需要复杂的配置。
数据写入:
以mysql为例:
1.需要schema.groovy。 这个文件用来指明,图中的所有节点和边存在哪些属性,存在什么样的节点,有什么样的属性。
schema.propertyKey("idx_code").asText().ifNotExist().create();
schema.propertyKey("status").asInt().ifNotExist().create();
schema.edgeLabel("useing").sourceLabel("api").targetLabel("lab").properties("status").nullableKeys("status").ifNotExist().create();
2.需要struct.json 。用来指明,节点和边分别对应哪些表。
hdfs 和 csv等其他文件类似。
数据查询:
Hugegraph 支持gremlin语言:
寻找 dalaro 的合作者:
g.V('dalaro').as('a').out('created').in('created').where(neq('a'))
求各个地区作者的平均年龄:
g.V().hasLabel('person').group().by('addr').by(values('age').mean())
JavaAPI
HugeClient hugeClient = new HugeClient("http://localhost:8080", "hugegraph");
GremlinManager gremlin = hugeClient .gremlin();
ResultSet resultSet = gremlin.gremlin("g.V().outE().path()").execute();
Iterator<Result> results = resultSet.iterator();
Gramlin 支持循环、逻辑运算、数学运算、合并、分支、排序、过滤、聚合等等。
个人在使用Hugegraph体会:
1. 虽然支持多图,但是无法向mysql那样方便直接创建,需要修改配置文件。
2. 节点删除复杂,不能通过节点主键直接删除节点和连带关系,需要一层一层的删除。
3. 出现超级节点怎么解决。
4. 关系探查简单,查询性能高。
5. 有可视化界面,层级关系一目了然
6. Gremlin语法简单明了。