59 neo4j 的一些基础使用

前言

呵呵 最近刚好有一些 图相关的问题, 所以 找了一下 图数据库, 然后 看到了一个 开源版本的 neo4j, 然后 试用了一下 

然后 主要是记录一下 常用的一些东西, 以及一些 使用的时候碰到的问题吧 

 

这里主要构造的 graph 和 03 graphx 从 SSSP 来看 pregel 相同 

 

 

docker 安装 neo4j 

docker pull neo4j:3.4
docker run -it -d -p 7474:7474 -p 7687:7687 neo4j:3.4

 

然后访问 7474 端口, 进入 web 页面 

进入之后 需要登录, neo4j, neo4j, 然后需要 改密码之类的 

59 neo4j 的一些基础使用_第1张图片

 

 

构造图, 执行一些常用的计算

图的相关数据如下  : /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()));
        }

    }

}

脚本执行之后, 生成点, 边的脚本如下 

59 neo4j 的一些基础使用_第2张图片

 

neo4j web 客户端执行创建节点, 边的脚本

59 neo4j 的一些基础使用_第3张图片

 

neo4j 查看所有的顶点, 边 

59 neo4j 的一些基础使用_第4张图片

 

来一个 0L -> 9L 的可到达路径查询 

59 neo4j 的一些基础使用_第5张图片

 

来一个 0L -> 9L 的最短路径查询 

59 neo4j 的一些基础使用_第6张图片

 

 

其他的一些基础操作

## 创建节点
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

 

 

访问其他服务器上面的neo4j修改密码 websocket 超时问题 

本机 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系列-新手入门(二)

 

 

你可能感兴趣的:(05,问题,neo4j,graphbase)