JanusGraph快速入门

笔者由于工作中需要用到图数据库,所以花2小时研究了下Janus Graph这个开源项目,下面是一些学习心得,如果后面使用有更多启发再更新,如有错误,欢迎纠正。

学习一门技术最标准的方式是从官网入门:https://docs.janusgraph.org/

然后搞清楚以下问题即可:

  1. 是什么?为什么出现?
  2. 基本原理
  3. 怎么使用
  4. 再深入理解原理

1.JanusGraph是什么

本质问题是图数据库是什么?

JanusGraph旨在支持当需要的存储和计算能力超出了单台计算机所能提供的范围的图处理。 包括对图数据进行实时遍历和分析查询,这是JanusGraph的基本优势。

关键词是:图数据、实时遍历、实时查询和分析。

事实上,很多数据不再是关系型数据了,比如,人的关系网络,物联网,物流、交通等。对这种数据进行查询就像对树进行深度或广度遍历,只是图不仅包括树,更像是森林。

下面是笔者绘制的Janus图的基本数据组成:https://docs.janusgraph.org/basics/schema/

图的组成

2.基本原理

2.1.存储

Janus支持的存储有

Apache Cassandra
Apache HBase
Oracle Berkeley DB Java Edition

存储和索引是分开的:

Elasticsearch
Apache Solr
Apache Lucene

以hbase为例:Janus只支持等值查询,将索引属性的值做一个hash,然后分段存储在多个regionserver,这样可以避免查询热点。

2.2.部署场景

https://docs.janusgraph.org/basics/deployment/
部署
当单独以Janus Server模式部署时,客户端与服务器进行交互可以选择:

  1. HTTP方式
  2. WebSocket方式
  3. 或者2者的组合

3.怎么使用

查询
对图的操作,最频繁的就是查询和分析,下面是一个demo项目。

demo

我们采用集成在应用里的方式,建一个java项目。

导入依赖

    <properties>
        <java.version>1.8</java.version>
        <janusgraph.version>0.5.1</janusgraph.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.janusgraph/janusgraph-core -->
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-core</artifactId>
            <version>${janusgraph.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.janusgraph/janusgraph-berkeleyje -->
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-berkeleyje</artifactId>
            <version>${janusgraph.version}</version>
        </dependency>

        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-driver</artifactId>
            <version>${janusgraph.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.janusgraph/janusgraph-inmemory -->
        <dependency>
            <groupId>org.janusgraph</groupId>
            <artifactId>janusgraph-inmemory</artifactId>
            <version>${janusgraph.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tinkerpop</groupId>
            <artifactId>gremlin-driver</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>

建立图

  1. 选择图的存储方式:这里为了快速使用,我们基于内存创建
    private static JanusGraph graph;

    @BeforeAll
    static void _1_create_graph_and_init_data() {
        final PropertiesConfiguration configuration = getGanusConfiguration();
        graph = JanusGraphFactory.open(configuration);
        // management = graph.openManagement();

        initSchema();
        initData();
    }

    private static PropertiesConfiguration getGanusConfiguration() {
        final PropertiesConfiguration p = new PropertiesConfiguration();
        p.setProperty("storage.backend", "inmemory");
        return p;
    }    
  1. 初始化schema:就像建表一样,不过这里的结构是: 点和边的label、属性keyValue
    private static void initSchema() {
//        final VertexLabel vHumanLabel = management.makeVertexLabel("v_human").make();
        final PropertyKey pkName = graph.makePropertyKey("pk_name")
                .dataType(String.class).cardinality(Cardinality.SET).make();

        // 人这个点有一个属性是姓名
        final VertexLabel vHumanLabel = graph.makeVertexLabel("v_human").make();
        graph.addProperties(vHumanLabel, pkName);

        // 婚姻这条边有一个属性是结婚年龄, 同时是一个无向边
        final PropertyKey pkMarriedYear = graph.makePropertyKey("pk_married_year")
                .dataType(Integer.class).cardinality(Cardinality.SINGLE).make();
        final EdgeLabel eWifeLabel = graph.makeEdgeLabel("e_married")
                /*.unidirected()*/.multiplicity(Multiplicity.ONE2ONE).make();
        graph.addProperties(eWifeLabel, pkMarriedYear);

        // 朋友关系,无向,多对多,有一个属性是好友关系强度
        final PropertyKey pkTight = graph.makePropertyKey("pk_tight")
                .dataType(Double.class).cardinality(Cardinality.SINGLE).make();
        final EdgeLabel eFriendLabel = graph.makeEdgeLabel("e_friend")
                /*.unidirected()*/.multiplicity(Multiplicity.MULTI).make();
        graph.addProperties(eFriendLabel, pkTight);
    }
  1. 导入数据: 这里插入3个点,3条关系
    private static void initData() {
        final String vHumanLabel = "v_human";
        final String eMarriedLabel = "e_married";
        final String eFriendLabel = "e_friend";
        final String pkMarriedYear = "pk_married_year";
        final String pkName = "pk_name";
        final String pkTight = "pk_tight";
        final Vertex vJimo = graph.addVertex(vHumanLabel);
        vJimo.property(pkName, "Jimo");
        final Vertex vLily = graph.addVertex(vHumanLabel);
        vLily.property(pkName, "Lily");

        final Vertex vHehe = graph.addVertex(vHumanLabel);
        vHehe.property(pkName, "Hehe");

        vJimo.addEdge(eMarriedLabel, vLily, pkMarriedYear, 10);
        vJimo.addEdge(eFriendLabel, vLily, pkTight, 0.5);
        vJimo.addEdge(eFriendLabel, vHehe, pkTight, 0.8);
        // vHehe.addEdge(eFriendLabel, vJimo, pkTight, 0.8);
    }

查询测试

  1. 遍历所有点和边:
    @Test
    void _2_traversal_all() {
        final GraphTraversalSource g = graph.traversal();

        final List<Vertex> vertices = g.V().toList();
        for (Vertex v : vertices) {
            System.out.println(v.label() + ":" + v.property("pk_name"));
        }

        final List<Edge> edges = g.E().toList();
        for (Edge e : edges) {
            final Iterator<Property<Object>> properties = e.properties();
            System.out.print(e.label() + ":");
            while (properties.hasNext()) {
                System.out.print(properties.next() + ",");
            }
            System.out.println();
        }
    }

结果:

v_human:vp[pk_name->Jimo]
v_human:vp[pk_name->Lily]
v_human:vp[pk_name->Hehe]

e_married:p[pk_married_year->10],
e_friend:p[pk_tight->0.8],
e_friend:p[pk_tight->0.5],
  1. 查询Jimo的朋友和老婆
    @Test
    void _3_query() {
        final GraphTraversalSource g = graph.traversal();

        final Vertex myWife = g.V().has("pk_name", "Jimo").out("e_married").next();
        printVertex(myWife);

        final List<Vertex> jimoFriends = g.V().has("pk_name", "Jimo").out("e_friend").toList();
        System.out.println("Jimo friends:");
        for (Vertex heheFriend : jimoFriends) {
            printVertex(heheFriend);
        }
    }

    private void printVertex(Vertex v) {
        final Iterator<VertexProperty<Object>> ps = v.properties();
        System.out.print(v.label() + ":");
        while (ps.hasNext()) {
            final VertexProperty<Object> property = ps.next();
            System.out.print(property + ",");
        }
        System.out.println();
    }

结果:

v_human:vp[pk_name->Lily],

Jimo friends:
v_human:vp[pk_name->Lily],
v_human:vp[pk_name->Hehe],

关闭图

    @AfterAll
    static void afterAll() {
        graph.close();
    }

4.深入理解

// TODO 待实现

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JanusGraph是一个开源的分布式数据库,可用于存储和处理大规模数据。JanusGraph 0.5.2是该数据库的一个特定版本,支持在Windows操作系统上使用。 使用JanusGraph 0.5.2在Windows上需要以下步骤: 1. 下载JanusGraph 0.5.2的安装包。可以从官方网站或GitHub上获取最新的发布版本。 2. 解压安装包到任意目录。确保你的系统上已经安装了Java环境,并且配置了JAVA_HOME环境变量。 3. 打开命令行窗口,进入JanusGraph的目录。 4. 在命令行窗口中运行bin/gremlin.bat脚本。这将启动JanusGraph的Gremlin Shell,Gremlin是一种遍历语言,用于与JanusGraph交互。 5. 在Gremlin Shell中,你可以执行各种数据库的操作,如创建、添加顶点和边、遍历等。使用Gremlin脚本文件(.groovy)将多个操作组合到一个文件中,并在Gremlin Shell中执行该文件。 6. 在Gremlin Shell中,你还可以执行Cypher查询语句来查询数据库中的数据。JanusGraph支持Cypher作为一种查询语言,并提供了相应的API。 7. 当你完成了对JanusGraph的操作,可以通过在Gremlin Shell中使用`:q`命令来退出。 总之,JanusGraph 0.5.2可以在Windows上使用,并且它提供了Gremlin Shell和Cypher查询语言来与数据库交互。通过执行相应的命令或脚本,你可以在Windows操作系统上创建、修改和查询大规模的数据。 ### 回答2: JanusGraph 0.5.2是一个开源的分布式数据库,它是基于Apache TinkerPop计算框架构建的,并且提供了许多强大的功能和扩展性。 关于在Windows上安装和配置JanusGraph 0.5.2,以下是简单的步骤: 1. 准备环境:首先,确保你有一个可用的Java安装,JanusGraph 0.5.2需要Java 8或更高版本。 2. 下载JanusGraph 0.5.2:在JanusGraph的官方网站或GitHub页面上下载JanusGraph 0.5.2的压缩包。 3. 解压缩文件:解压缩下载的压缩包到一个合适的目录,例如"JanusGraph"文件夹。 4. 配置JanusGraph:在JanusGraph目录中,找到并编辑"janusgraph-hbase.properties"文件。根据你的需要配置数据库后端(如HBase或Cassandra)和相关参数。 5. 启动JanusGraph:在命令提示符或PowerShell窗口中,导航到JanusGraph目录,并运行以下命令启动JanusGraph服务器: ``` bin\janusgraph.bat ``` 6. 使用JanusGraph:一旦服务器启动,你可以使用Gremlin控制台或TinkerPop兼容的数据库客户端连接到JanusGraph,并执行各种数据库操作。 如此,你就成功地在Windows上安装和配置了JanusGraph 0.5.2。根据你的具体需求,你可以进一步探索JanusGraph的功能和性能优化。 ### 回答3: JanusGraph 0.5.2是一个开源的分布式数据库,它可以在Windows操作系统上运行。JanusGraph具有扩展性和可靠性,支持高性能的数据查询和处理。 在Windows上安装和配置JanusGraph 0.5.2相对简单,以下是一些基本步骤: 1. 首先,在JanusGraph的官方网站上下载适用于Windows的JanusGraph压缩包。 2. 解压缩JanusGraph压缩包到你选择的目录中。 3. 打开目录中的`conf`文件夹,在这里你可以找到`janusgraph.properties`文件。 4. 使用一个文本编辑器打开`janusgraph.properties`文件,对其进行必要的配置。你需要指定一个Cassandra或HBase的存储后端,以及一些其他的配置选项。此外,你还可以根据需求进行其他配置调整,例如调整缓存和连接池的大小等。 5. 保存并关闭`janusgraph.properties`文件。 6. 打开命令提示符,并进入JanusGraph目录下的`bin`文件夹。 7. 在命令提示符中,输入以下命令以启动JanusGraph服务器: ``` janusgraph.bat start ``` 8. 等待一段时间,直到看到类似于“Graph database loaded (...)”的消息。 9. 现在,JanusGraph服务器已经在Windows上成功启动。 10. 如果需要连接到JanusGraph服务器并执行数据库操作,可以使用Gremlin控制台或通过客户端编程语言(如Java、Python等)与JanusGraph进行通信。 总的来说,JanusGraph 0.5.2可以在Windows上运行,只需进行一些简单的配置即可。希望这些步骤对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值