呵呵 最近刚好有一些 图相关的问题, 所以 找了一下 图数据库, 然后 看到了一个 开源版本的 neo4j, 然后 试用了一下
然后 主要是记录一下 常用的一些东西, 以及一些 使用的时候碰到的问题吧
这里主要构造的 graph 和 03 graphx 从 SSSP 来看 pregel 相同
docker pull neo4j:3.4
docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:3.4
然后访问 7474 端口, 进入 web 页面
进入之后 需要登录, neo4j, neo4j, 然后需要 改密码之类的
图的相关数据如下 : /Users/jerry/Tmp/28_collectPathes/graph07.txt
Edge(3L, 7L, 1.0d),
Edge(5L, 3L, 1.0d),
Edge(2L, 5L, 1.0d),
Edge(5L, 7L, 1.0d),
Edge(0L, 3L, 1.0d),
Edge(3L, 2L, 1.0d),
Edge(7L, 9L, 1.0d),
Edge(0L, 5L, 1.0d),
编写一个 生成 neo4j 构造顶点, 边的脚本
package com.hx.test07;
import com.hx.log.util.Tools;
import javafx.util.Pair;
import java.util.ArrayList;
import java.util.List;
/**
* Test29GenerateVertexEdgeList
*
* @author Jerry.X.He <[email protected]>
* @version 1.0
* @date 2020/6/23 20:21
*/
public class Test29GenerateVertexEdgeList {
// Test29GenerateVertexEdgeList
public static void main(String[] args) throws Exception {
String graphPath = "/Users/jerry/Tmp/28_collectPathes/graph07.txt";
List lines = Tools.getContentWithList(graphPath);
List> edges = new ArrayList<>();
List vertexes = new ArrayList<>();
for(String line : lines) {
if(Tools.isCommentLine(line)) {
continue ;
}
String[] splits = line.split("\\s*,\\s*");
String sourceId = Tools.getStrInRangeWithStart(splits[0], "Edge(");
String targetId = splits[1];
edges.add(new Pair<>(sourceId, targetId));
if(!vertexes.contains(sourceId)) {
vertexes.add(sourceId);
}
if(!vertexes.contains(targetId)) {
vertexes.add(targetId);
}
}
for(String vertex : vertexes) {
System.out.println(String.format("CREATE (v%s:Vertex {id : '%s'})", vertex, vertex));
}
System.out.println("CREATE");
for(Pair edge : edges) {
System.out.println(String.format(" (v%s)-[:edge]->(v%s),", edge.getKey(), edge.getValue()));
}
}
}
脚本执行之后, 生成点, 边的脚本如下
neo4j web 客户端执行创建节点, 边的脚本
neo4j 查看所有的顶点, 边
来一个 0L -> 9L 的可到达路径查询
来一个 0L -> 9L 的最短路径查询
## 创建节点
CREATE (p:Person { name:"Keanu Reeves", born:1964 })
RETURN p
## 给两个节点之间创建关联
MATCH (p:Person {name : "张三"})
MATCH (q:Person {name : "Keanu Reeves"})
create (p)-[r:Edge {}]->(q)
return p, q
## 删除 vertex 和 vertex 之间的所有的边
match (v1:Vertex) -[e:edge]-> (v2:Vertex) delete e, v1, v2
本机 ip : 192.168.1.121, 开放 neo4j 服务的虚拟机 ip 为 192.168.1.190
进入 浏览器访问 192.168.1.190:7474
然后提示 输入用户名, 密码, 输入 neo4j, neo4j
然后提示更新 密码, 输入密码之后点击确定, 发现 一部分的 websocket 请求发送的是 192.168.1.190, 另外还有一部分 websocket 请求发送的是 localhost(192.168.1.121) 访问不到
然后 解决的方法, 进入 neo4j 容器, 使用 cypher 客户端 手动 修改密码, 然后 之后再从浏览器 进入
# whereis neo4j
neo4j: /var/lib/neo4j/bin/neo4j
# cd /var/lib/neo4j/bin
# ls
cypher-shell neo4j neo4j-admin tools
# ./cypher-shell
username: neo4j
password: *****
Password change required
new password: ******
Connected to Neo4j 4.0.6 at neo4j://localhost:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.
neo4j@neo4j>
我这里需求是 计算 A -> B 的全路径
然后 我造了 100 个节点, 2000 条边
我的理解是 这种专门的图数据库, 应该会在添加节点的时候 就回做一部分的数据处理, 然后 查询的时候使用这部分计算结果, 二次处理
但是 我查询了一下 A -> B, 直接崩了
另外就是上面的 全路径 和 最短路径 也有一些奇怪, 我构造的图中没有 3->3, 5->5, 但是结果里面却有这种情况, 呵呵 可能是我忽略了什么吧
呵呵 感觉 还是 graphx, 来计算靠谱一点呀
使用docker安装neo4j
Neo4j系列-新手入门(二)