Dgraph 入门教程四《开发环境的搭建》

在深入 了解Dgraph 之前,我们先了解下开发环境,毕竟让开发人员真正动起手来才是第一步。

Dgraph 支持很多种语言的开发,包括GO,Python,JS,C#和Java等等。出于项目需要,只了解下JS和Java。

1、NodeJS 开发

首先要说一下,js 有两个库,一个gRPC JS Client,一个HTTP JS Client。这里只以http 为例,http也是我们更熟悉的使用方式。

1.1 、demo 下载

链接:https://pan.baidu.com/s/1GCY-dMkHogsVX6mPv3ioqg 
提取码:jzvt 
下载该链接的nodejs-http

1.2、 运行demo

 首先用vscode 打开,安装 ,直接npm install 实现安装。

npm install 

修改Dgraph的地址,这给地址一定要改成自己的服务地址

用node 执行上面的js 代码,在demo里面如下执行

node index-promise.js

看到下面信息,表示执行成功

可以用Ratel UI 去查看,可以看到刚才加入的内容

1.3 、讲解

先看下 package.json, node 安装了一个dgraph-js-http的库,正是因为这个库,我们可以用nodejs开发。这个库是开源的,可以去官方下载。

1.3.1、看下完整的demo代码

const dgraph = require("dgraph-js-http");

// Create a client stub.
function newClientStub() {
    return new dgraph.DgraphClientStub("http://10.10.10.215:8080");
}

// Create a client.
function newClient(clientStub) {
    return new dgraph.DgraphClient(clientStub);
}

// Drop All - discard all data and start from a clean slate.
function dropAll(dgraphClient) {
    return dgraphClient.alter({ dropAll: true });
}

// Set schema.
function setSchema(dgraphClient) {
    const schema = `
        name: string @index(exact) .
        age: int .
        married: bool .
        loc: geo .
        dob: datetime .
    `;
    return dgraphClient.alter({ schema: schema });
}

// Create data using JSON.
function createData(dgraphClient) {
    // Create a new transaction.
    const txn = dgraphClient.newTxn();

    // Create data.
    const p = {
        name: "Alice",
        age: 26,
        married: true,
        loc: {
            type: "Point",
            coordinates: [1.1, 2],
        },
        dob: new Date(1980, 1, 1, 23, 0, 0, 0),
        friend: [
            {
                name: "Bob",
                age: 24,
            },
            {
                name: "Charlie",
                age: 29,
            }
        ],
        school: [
            {
                name: "Crown Public School",
            }
        ]
    };

    let assigned;
    let err;

    // Run mutation.
    return txn.mutate({ setJson: p }).then((res) => {
        assigned = res;

        // Commit transaction.
        return txn.commit();
    }).then(() => {
        // Get uid of the outermost object (person named "Alice").
        // Assigned#getUidsMap() returns a map from blank node names to uids.
        // For a json mutation, blank node names "blank-0", "blank-1", ... are used
        // for all the created nodes.
        console.log(`Created person named "Alice" with uid = ${assigned.data.uids["blank-0"]}\n`);

        console.log("All created nodes (map from blank node names to uids):");
        for (let key in assigned.data.uids) {
            if (Object.hasOwnProperty(assigned.data.uids, key)) {
                console.log(`${key}: ${assigned.data.uids[key]}`);
            }
        }
        console.log();
    }).catch((e) => {
        err = e;
    }).then(() => {
        return txn.discard();
    }).then(() => {
        if (err != null) {
            throw err;
        }
    });
}

// Query for data.
function queryData(dgraphClient) {
    // Run query.
    const query = `query all($a: string) {
        all(func: eq(name, $a)) {
            uid
            name
            age
            married
            loc
            dob
            friend {
                name
                age
            }
            school {
                name
            }
        }
    }`;
    console.log(query);
    const vars = { $a: "Alice" };

    return dgraphClient.newTxn().queryWithVars(query, vars).then((res) => {
        const ppl = res.data;

        // Print results.
        console.log(`Number of people named "Alice": ${ppl.all.length}`);
        for (let i = 0; i < ppl.all.length; i++) {
            console.log(ppl.all[i]);
        }
    });
}

function main() {
    const dgraphClientStub = newClientStub();
    const dgraphClient = newClient(dgraphClientStub);
    return dropAll(dgraphClient).then(() => {
        return setSchema(dgraphClient);
    }).then(() => {
        return createData(dgraphClient);
    }).then(() => {
        return queryData(dgraphClient);
    });
}

main().then(() => {
    console.log("\nDONE!");
}).catch((e) => {
    console.log("ERROR: ", e);
});

还有异步代码 ,请查看demo。

1.3.2 、链接服务端

用如下代码

const dgraph = require("dgraph-js-http");

const clientStub = new dgraph.DgraphClientStub(
    // addr: optional, default: "http://localhost:8080"
    "http://localhost:8080",
    // legacyApi: optional, default: false. Set to true when connecting to Dgraph v1.0.x
    false,
);
const dgraphClient = new dgraph.DgraphClient(clientStub);

1.3.3 、操作Schema

用下面的代码去更新Schema

const schema = "name: string @index(exact) .";
await dgraphClient.alter({ schema: schema });

比如在demo中

// Set schema.
function setSchema(dgraphClient) {
    const schema = `
        name: string @index(exact) .
        age: int .
        married: bool .
        loc: geo .
        dob: datetime .
    `;
    return dgraphClient.alter({ schema: schema });
}

1.3.4、操作数据

用mutate 函数操作数据,可以在demo中找到类似代码

// Create data.
const p = {
    name: "Alice",
};

// Run mutation.
await txn.mutate({ setJson: p });

1.3.5、查询数据

可以用变量去拼查询语句。比如变量 $a。

query all($a: string) {
  all(func: eq(name, $a))
  {
    name
  }
}

其他的方式请查看对应的API

2、Java的开发

2.1、demo的下载

链接:https://pan.baidu.com/s/1GCY-dMkHogsVX6mPv3ioqg 
提取码:jzvt 
下载该链接的DraphJavaSample

注意我们用的是官方的gPRC框架,这个框架不需要安装Idea软件。如果用Spring boot 和Idea软件,只需要参考App.java的内容即可。

2.2、运行demo

首先要装好java 版本,最好是java 9以上的

用vscode 打开,修改ip和端口号

运行

./gradlew run

出现如下代码表示运行成功

2.3、讲解

2.3.1、链接服务端

下面代码演示了链接方法

ManagedChannel channel1 = ManagedChannelBuilder
    .forAddress("localhost", 9080)
    .usePlaintext().build();
DgraphStub stub1 = DgraphGrpc.newStub(channel1);

2.3.2 、操作Schema

增加一个name的Shema

String schema = "name: string @index(exact) .";
Operation operation = Operation.newBuilder()
        .setSchema(schema)
        .setRunInBackground(true)
        .build();
dgraphClient.alter(operation);

2.3.3、操作数据

演示了用一个Person的对象去操作数据

String schema = "name: string @index(exact) .";
Operation operation = Operation.newBuilder()
        .setSchema(schema)
        .setRunInBackground(true)
        .build();
dgraphClient.alter(operation);

2.3.4、查询数据

// Query
String query =
"query all($a: string){\n" +
"  all(func: eq(name, $a)) {\n" +
"    name\n" +
"  }\n" +
"}\n";

Map<String, String> vars = Collections.singletonMap("$a", "Alice");
Response response = dgraphClient.newReadOnlyTransaction().queryWithVars(query, vars);

// Deserialize
People ppl = gson.fromJson(response.getJson().toStringUtf8(), People.class);

// Print results
System.out.printf("people found: %d\n", ppl.all.size());
ppl.all.forEach(person -> System.out.println(person.name));

3、总结

        本章主要介绍了NodeJS和Java对Dgraph的常用操作逻辑。对Dgraph的操作分同步和异步的,本文以同步为例子,做了加单介绍,对于异步只是Api的调用方式不一样,在此不做详细介绍了。其他语言的调用方式其实大通小异,需要使用的可以去官方看教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基础小白快速入门web前端开发技术------->hbuilder的下载安装以及简易的网页最开始制作

工欲善其事&#xff0c;必先利其器&#xff0c; 在我们学习开发网页设计&#xff0c;我们首先需要一个良好的开发工具 这里我比较推荐hbuilder这个 只需要进入官网傻瓜下载&#xff0c;傻瓜安装 https://dcloud.io/ 点击hbuilder选择版本进行下载安装即可 hbuilder的新建文件…

深度强化学习(四)SARSA

深度强化学习&#xff08;四&#xff09;SARSA算法 一.SARSA 假设状态空间 S \mathcal{S} S 和动作空间 A \mathcal{A} A 都是有限集, 即集合中元素数量有限。比如, S \mathcal{S} S 中一共有 3 种状态, A \mathcal{A} A 中一共有 4 种动作。那么动作价值函数 Q π ( s …

ida pro 查看简易 Android .so 文件伪代码

参考&#xff1a; IDA Pro 反汇编器使用详解&#xff0c;适合逆向新人和老人的权威指南&#xff08;一&#xff09;-CSDN博客 注意&#xff0c;这篇只是我的简单记录&#xff0c;要学习详细使用&#xff0c;请参考其他大佬的。 让我们打开神器 IDA 直接把需要的文件拖到 IDA …

3.1_2 覆盖与交换

3.1_2 覆盖与交换 &#xff08;一&#xff09;覆盖技术 早期的计算机内存很小&#xff0c;比如IBM 推出的第一台PC机最大只支持1MB大小的内存。因此经常会出现内存大小不够的情况。 后来人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总和”的问题。 覆盖技术的…

工业智能网关的网关模式和交换机模式有哪些区别

工业智能网关主要用以实现工业物联网络中不同设备和系统之间的通信&#xff0c;工业智能网关常见的两种工作模式是网关模式和交换机模式&#xff0c;在功能和应用场景上存在显著差异&#xff0c;本篇就为大家简单介绍一下两者之间的主要区别&#xff1a; 1、网关模式 工业智能…

String 底层为什么使用 final 修饰?

1、典型回答 对于这个问题&#xff0c;Java之父詹姆斯 高斯林&#xff08;James Gosling&#xff09; 是这样回答的&#xff1a; I would use an immutable whenever I can 翻译为中文&#xff1a;只要允许&#xff0c;我就会使用不可变对象 而作为普通人的我们来说&#xff0…

有一说一,CSPM真的是垃圾证书吗?

CSPM是什么&#xff1f; CSPM——项目管理专业人员能力评价&#xff0c;是中国人自己的一套项目管理专业人士的评价指南&#xff0c;符合中国国情且符合中国未来发展的一套项目刊专业人员能力评价的标准。 PMP项目管理专业人士资格认证&#xff0c;由美国项目管理协会——PMI…

根到叶路径问题:遍历框架 + 前中后序位置 + 路径记录 + 叶子节点处理

根到叶路径问题 257. 二叉树的所有路径129. 求根节点到叶节点数字之和112. 路径总和113. 路径总和 II437. 路径总和 III988. 从叶结点开始的最小字符串124. 二叉树中的最大路径和 257. 二叉树的所有路径 问题描述&#xff1a;找出所有从根节点到叶子节点的路径&#xff0c;并以…

ATFX汇市:美国2月CPI数据来袭,高通胀问题或进一步缓解

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布2月未季调核心CPI年率数据&#xff0c;前值为3.9%&#xff0c;预期值3.7%&#xff0c;预期将下降0.2个百分点。历史数据看&#xff0c;美国核心CPI年率处于快速下降状态&#xff0c;去年3月份数据仍高达5.6%&#xf…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年&#xff0c;由马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;、埃迪华索伦&#xff08;Eduardo Saverin&#xff09;、安德鲁麦克卡拉姆&#xff08;Andrew McCollum&#xff09;、克里斯休斯&#xff08;Chris Hughes&#x…

prometheus 原理(架构,promql表达式,描点原理)

大家好&#xff0c;我是蓝胖子&#xff0c;提到监控指标&#xff0c;不得不说prometheus&#xff0c;今天这篇文章我会对prometheus 的架构设计&#xff0c;promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…

Vue3全家桶 - Vue3 - 【4】侦听器

侦听器 一、 组合式API&#xff1a; 1.1 watch()函数 创建侦听器: 语法:// 先导入 watch 函数 import { watch } from vue watch(source, callback, options)source&#xff1a; 需要侦听的数据源&#xff0c;可以是 ref&#xff08;包括计算属性&#xff09;、一个响应式对…

从监控到稳定性可观测:从问题响应到预防的技术变革

从单体架构到集群架构再到微服务架构&#xff0c;业务越来越庞大&#xff0c;也越来越复杂。每一次架构的升级&#xff0c;在提升了业务吞吐量的同时&#xff0c;必然会带来更大的复杂度。云原生时代背景下&#xff0c;微服务、Service Mesh、 Serverless 等新技术的出现&#…

sql面试题21:营销带货销量分析

题目大概意思&#xff1a; 找出网红带来的订单号和销售额&#xff08;销售额是该订单的&#xff0c;比如凑单&#xff09;&#xff0c;满足是优惠码是1的&#xff0c;B类商品 数据表两个&#xff0c;分别是订单和品类 CREATE TABLE 订单 (订单号 VARCHAR(512),商品号 VARCH…

LED线性恒流控制芯片两段/三段开关调光/调色:SM2223E

LED线性恒流控制芯片的开关调光/调色功能可以通过以下两种方式实现&#xff1a; LED线性恒流控制芯片的开关调光/调色功能 1. 两段调光/调色&#xff1a;通过开启或关闭电源开关&#xff0c;可以调节LED灯的亮度或色温&#xff0c;从而改变输出电流的大小。这种方式适用于需要…

Redis及其数据类型和常用命令(一)

Redis 非关系型数据库&#xff0c;不需要使用sql语句对数据库进行操作&#xff0c;而是使用命令进行操作&#xff0c;在数据库存储时使用键值对进行存储&#xff0c;应用场景广泛&#xff0c;一般存储访问频率较高的数据。 一般关系型数据库&#xff08;使用sql语句进行操作的…

ChatGPT引领智能对话:微信小程序的新潮玩法

1.引言 ChatGPT是由OpenAI开发的基于深度学习的自然语言处理模型&#xff0c;它在人工智能领域具有重要的影响力。ChatGPT基于大规模的文本数据进行训练&#xff0c;能够生成高质量的自然语言文本&#xff0c;包括对话、文章等。它的影响力主要体现在以下几个方面&#xff1a;…

系统及其分类

系统定义 系统&#xff1a;指若干相互关联的事物组合而成的具有特定功能的整体。 系统的基本作用&#xff1a;对输入信号进行加工和处理&#xff0c;将其转换为所需要的输出信号。 系统分类 系统的分类错综复杂&#xff0c;主要考虑其数学模型的差异来划分不同类型。主要分为…

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统&#xff1a;Windows 10/11 64 位 内存&#xff1a;8GB 及以上 硬盘&#xff1a;100GB 及以上 分辨率&#xff1a;1280*800 像素及以上macOS 操作系统&#xff1a;mac…

leetcode代码记录(有序数组两数之和

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numb…