关于graph:GraphQL-快速入门4GraphQL-组件

【注】本文译自: GraphQL - Quick Guide (tutorialspoint.com)    本章探讨不同的 GraphQL 组件以及它们互相通信的形式。整个应用程序组件能够辨别如下: 服务器端组件客户器端组件 服务端组件    GraphQL 服务器形成了服务器端的外围组件,并容许解析来自 GraphQL 客户端应用程序的查问。Apollo Server 是最罕用的 GraphQL 标准实现。其余服务器编程组件包含以下内容: 序号服务器要点和形容1模式(Schema) GraphQL 模式是任何 GraphQL 服务器实现的核心,它形容了连贯到它的客户端可用的性能。2查问(Query) GraphQL 查问是从数据库或遗留 API 检索数据的客户端利用申请。3解析器(Resolver) 解析器提供了将 GraphQL 操作转换为数据的指令。他们通过定义解析器函数将查问解析为数据。客户端组件    上面给出的是客户端组件: 序号工具和形容1GraphiQL 基于浏览器的界面,用于编辑和测试。2ApolloClient 构建 GraphQL 客户端应用程序的最佳工具。1GraphiQL基于浏览器的界面,用于编辑和测试 GraphQL 查问和变更。2ApolloClient构建 GraphQL 客户端应用程序的最佳工具。与所有 javascript 前端集成良好。     下图显示了客户端-服务器架构。Web 服务器建设在 NodeJs 和 Express 框架之上。ReactJS 应用程序(应用 Apollo 客户端库构建)或 GraphiQL 浏览器应用程序向 Apollo GraphQL 服务器发出请求。查问将依据服务器中定义的模式进行解析和验证。如果申请模式通过验证,则将执行关联的解析器函数。解析器将蕴含从 API 或数据库获取数据的代码。

September 28, 2021 · 1 min · jiezi

关于graph:深入The-Graph数据库

The Graph网络对Web3的查问层和API层进行了去中心化,打消了DApp开发者目前面临的取舍难题:到底是开发一个高性能利用,还是开发一个齐全去中心化的利用。目前,开发者能够在本人的基础架构上运行一个Graph节点,也能够在咱们的托管服务上开发一个。其中,开发者构建和部署从Web3数据源提取数据并为其编制索引的子图。目前曾经有许多当先的以太坊我的项目创立了子图,包含Uniswap、ENS、DAOstack、Synthetix和Moloch等。在The Graph网络中,任何索引器都可能通过抵押Graph代币(GRT)参加到网络中,并在提供查问服务的过程赚取费用和通货膨胀处分。用户则依照应用次数进行付费,应用日益增长的索引器,此做法证实了供需法则也实用于该协定提供的服务。 The Graph 简略了解相当于是区块链下面的搜索引擎,爬取区块链上的区块数据, 而后依据用户制订的规定进行搜寻,不便各个DApp查问。 本文将深刻The Graph的数据库,看看The Graph是怎么实现数据存储的。 The Graph表构造 下面是The Graph的数据库构造。 subgraph是个外围数据库,外面寄存着所有子图的根底信息;每当创立一个新的子图的时候, 就会有一个新的数据库产生,比方上图中sgd1是給第一个子图的数据库, 数据库名字按序号递增。Subgraph数据库存储每次新创建的subgraph会寄存在上面表中 新创建subgraph的时候会有些的数据库生成, 专门用来寄存该subgraph外面定义的schema。 如果上传的subgraph的文件没有发生变化, 则不会从新生成新的数据库。 以下是一些外围的表: subgraph: 寄存subgraph的根本信息,比方名字,创立工夫, block range等;subgraph_deployment:寄存subgraph的布署信息以及和区块链的同步信息, 比方最早和最迟的区块号等;subgraph_error: 子图在布署过程中碰到的一些谬误。每个subgraph的存储 每个subgraph本人的数据库外面,寄存着子图外面schema entity对应的表。 每个子图定义的entity对应一张表,表构造对应entity的构造。 比方上面这个entity的定义: type Token @entity { # token address id: ID! # mirrored from the smart contract symbol: String! name: String! decimals: BigInt! # used for other stats like marketcap totalSupply: BigInt! # token specific volume tradeVolume: BigDecimal! tradeVolumeUSD: BigDecimal! untrackedVolumeUSD: BigDecimal! # transactions across all pairs txCount: BigInt! # liquidity across all pairs totalLiquidity: BigDecimal! # derived prices derivedETH: BigDecimal # derived fields tokenDayData: [TokenDayData!]! @derivedFrom(field: "token") pairDayDataBase: [PairDayData!]! @derivedFrom(field: "token0") pairDayDataQuote: [PairDayData!]! @derivedFrom(field: "token1") pairBase: [Pair!]! @derivedFrom(field: "token0") pairQuote: [Pair!]! @derivedFrom(field: "token1")}对应的表构造 ...

August 31, 2021 · 1 min · jiezi

leetcode399-Evaluate-Division

题目要求Equations are given in the format A / B = k, where A and B are variables represented as strings, and k is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return -1.0.Example:Given a / b = 2.0, b / c = 3.0.queries are: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .return [6.0, 0.5, -1.0, 1.0, -1.0 ].The input is: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries , where equations.size() == values.size(), and the values are positive. This represents the equations. Return vector<double>.According to the example above:equations = [ ["a", "b"], ["b", "c"] ],values = [2.0, 3.0],queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]. The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction.已知一些字母之间的关系式,问是否能够计算出其它字母之间的倍数关系?如已知a/b=2.0 b/c=3.0问是否能够计算出a/c, b/a, a/e, a/a, x/x的值。如果无法计算得出,则返回-1。这里x/x的值因为在条件中无法获知x是否等于零,因此也无法计算其真实结果,也需要返回-1。 ...

May 5, 2019 · 2 min · jiezi

Gremlin入门

Gremlin入门一、Gremlin简介Gremlin是Apache ThinkerPop框架下的图遍历语言,Gremlin是一种函数式数据流语言,可以使用户使用简洁的方式表述复杂的属性图的遍历或查询。每个Gremlin遍历由一系列步骤(可能存在嵌套)组成,每一步都在数据流(data stream)上执行一个原子操作。Gremlin 语言包括三个基本的操作:map-step:对数据流中的对象进行转换;filter-step:对数据流中的对象就行过滤;sideEffect-step:对数据流进行计算统计;Tinkerpop3 模型核心概念Graph: 维护节点&边的集合,提供访问底层数据库功能,如事务功能Element: 维护属性集合,和一个字符串label,表明这个element种类Vertex: 继承自Element,维护了一组入度,出度的边集合Edge: 继承自Element,维护一组入度,出度vertex节点集合.Property: kv键值对VertexProperty: 节点的属性,有一组健值对kv,还有额外的properties 集合。同时也继承自element,必须有自己的id, label.Cardinality: 「single, list, set」 节点属性对应的value是单值,还是列表,或者set。二、Gremlin查询示例先介绍一下图中比较核心的几个概念:Schema:Schema是一种描述语言,这里就是指所有属性和类型的集合,包括边和点的属性,边和点的Label等;属性类型(PropertyKey ):只边和点可以使用的属性类型;顶点类型(VertexLabel):顶点的类型,比如User,Car等;边类型(EdgeLabel):边的类型,比如know,use等;顶点(Vertex):就是图中的顶点,代表图中的一个节点;边(Edge):就是图中的边,连接两个节点,分为有向边和无向边;创建属性类型graph.schema().propertyKey(“name”).asText().ifNotExist().create()graph.schema().propertyKey(“age”).asInt().ifNotExist().create()graph.schema().propertyKey(“city”).asText().ifNotExist().create()graph.schema().propertyKey(“lang”).asText().ifNotExist().create()graph.schema().propertyKey(“date”).asText().ifNotExist().create()graph.schema().propertyKey(“price”).asInt().ifNotExist().create()创建顶点类型person = graph.schema().vertexLabel(“person”).properties(“name”, “age”, “city”).primaryKeys(“name”).ifNotExist().create()software = graph.schema().vertexLabel(“software”).properties(“name”, “lang”, “price”).primaryKeys(“name”).ifNotExist().create()创建边类型knows = graph.schema().edgeLabel(“knows”).sourceLabel(“person”).targetLabel(“person”).properties(“date”).ifNotExist().create()created = graph.schema().edgeLabel(“created”).sourceLabel(“person”).targetLabel(“software”).properties(“date”, “city”).ifNotExist().create()创建顶点和边marko = graph.addVertex(T.label, “person”, “name”, “marko”, “age”, 29, “city”, “Beijing”)vadas = graph.addVertex(T.label, “person”, “name”, “vadas”, “age”, 27, “city”, “Hongkong”)lop = graph.addVertex(T.label, “software”, “name”, “lop”, “lang”, “java”, “price”, 328)josh = graph.addVertex(T.label, “person”, “name”, “josh”, “age”, 32, “city”, “Beijing”)ripple = graph.addVertex(T.label, “software”, “name”, “ripple”, “lang”, “java”, “price”, 199)peter = graph.addVertex(T.label, “person”,“name”, “peter”, “age”, 29, “city”, “Shanghai”)marko.addEdge(“knows”, vadas, “date”, “20160110”)marko.addEdge(“knows”, josh, “date”, “20130220”)marko.addEdge(“created”, lop, “date”, “20171210”, “city”, “Shanghai”)josh.addEdge(“created”, ripple, “date”, “20151010”, “city”, “Beijing”)josh.addEdge(“created”, lop, “date”, “20171210”, “city”, “Beijing”)peter.addEdge(“created”, lop, “date”, “20171210”, “city”, “Beijing”)展示图g.V() //创建使用graph,查询使用g,其实g就是graph.traversal()查询点g.V().limit(5) // 查询所有点,但限制点的返回数量为5,也可以使用range(x, y)的算子,返回区间内的点数量。g.V().hasLabel(‘person’) // 查询点的label值为’person’的点。g.V(‘11’) // 查询id为‘11’的点。查询边g.E() // 查询所有边,不推荐使用,边数过大时,这种查询方式不合理,一般需要添加过滤条件或限制返回数量。g.E(‘55-81-5’) // 查询边id为‘55-81-5’的边。g.E().hasLabel(‘knows’) // 查询label为‘knows’的边。g.V(‘46’).outE(‘knows’) // 查询点id为‘46’所有label为‘knows’的边。查询属性g.V().limit(3).valueMap() // 查询点的所有属性(可填参数,表示只查询该点, 一个点所有属性一行结果)。g.V().limit(1).label() // 查询点的label。g.V().limit(10).values(’name’) // 查询点的name属性(可不填参数,表示查询所有属性, 一个点每个属性一行结果,只有value,没有key)。删除点g.V(‘600’).drop() // 删除ID为600的点。删除边g.E(‘501-502-0’).drop() //删除ID为“501-502-0”的边。查询二度好友和共同好友数//查询一度好友g.V(‘1500771’).out()//查询二度好友g.V(‘1500771’).out().out().dedup().not(hasId(‘1500771’))//查询共同好友数g.V(‘1500771’).out().out().hasId(‘2165197’).path().simplePath().count()此外,还有查询,遍历,过滤,路径,迭代,转换,排序,逻辑,统计,分支等语法,可以参考:http://tang.love/2018/11/15/g…。参考:http://tang.love/2018/11/15/g…https://hugegraph.github.io/h… ...

January 29, 2019 · 1 min · jiezi

HugeGraph入门

HugeGraph入门一、HugeGraph简介最近在搞好友推荐方便的工作,选择了图数据的方法,使用并学习了HugeGraph,再次记录一下。HugeGraph是百度在2018年中旬开源的一款图数据库(Graph Database)系统,可以存储海量的顶点(Vertex)和边(Edge)。实现了Apache ThinkerPop 31框架,支持Gremlin图查询语言2。HugeGraph支持多用户并行操作,用户可输入Gremlin查询语句,并及时得到图查询结果。也可以再用户程序中调用hugeGraph API进行图分析或查询。二、HugeGraph特性HugeGraph支持在线及离线环境下的图操作,支持批量导入数据,支持高效的负责关联关系分析,并且能够与大数据平台无缝集成。HugeGraph具备如下特点:基于ThinkerPop 3框架实现,支持Gremlin查询语言;支持从TXT、CSV、JSON等格式的文件中批量导入数据;具备独立的Schema元数据信息,方便第三方系统集成;具备可视化操作界面,降低用户使用门槛;存储系统采用插件方式,支持RocksDB、Cassandra、ScyllaDB、HBase及Mysql等多种后端;优化的图接口,最短路径、K步连通子图、K步到达邻接点等;支持属性图,顶点和边均可添加属性,支持丰富的属性类型;可以对边和顶点的属性建立索引,支持精确查询、范围查询、全文检索;支持4种顶点ID策略,之间ID、自动生成ID、用户自定义字符串ID和用户自定义数据ID;支持与Hadoop、Spark GraphX等大数据系统集成,支持Bulk Load操作。三、HugeGraph框架模块HugeGraph-Server: HugeGraph-Server是HugeGraph项目的核心部分,包含Core、Backend、API等子模块;Core:图引擎实现,向下连接Backend模块,向上支持API模块;Backend:实现将图数据存储到后端,支持的后端包括:Memory、Cassandra、ScyllaDB、RocksDB、HBase以及Mysql,用户根据实际情况选择一种即可;API:内置REST Server,向用户提供RESTful API,同时兼容Gremlin查询。HugeGraph-Client:HugeGraph-Client提供了RESTful API的客户端,用于连接HugeGraph-Server,目前仅实现Java版,其他语言用户可自行实现;HugeGraph-Studio:HugeGraph-Studio是HugeGraph的Web可视化工具,可用于执行Gremlin语句及展示图;HugeGraph-Loader :HugeGraph-Loader是基于HugeGraph-Client的数据导入工具,将普通文本数据转化为图形的顶点和边并插入图形数据库中;HugeGraph-Spark:基于Spark GraphX的图分析工具 ,HugeGraph-Spark能在图上做并行计算,例如PageRank算法等;HugeGraph-Tools:HugeGraph-Tools是HugeGraph的部署和管理工具,包括管理图、备份/恢复、Gremlin执行等功能。总结:部署HugeGraph需要HugeGraph-Server,在网页上操作图需要HugeGraph-Studio,在java项目中操作图需要HugeGraph-Client,其他三个视情况需要的时候再部署使用。四、HugeGraph安装部署4.1 安装HugeGraph-Server(必须)依赖:JDK1.8使用使用的是RocksDB存储则需要GCC >= 4.3.0 ,下面的步骤假设使用RocksDB作为存储步骤1:# 下载tar包wget https://github.com/hugegraph/hugegraph/releases/download/v${version}/hugegraph-${version}.tar.gztar -zxvf hugegraph-${version}.tar.gz步骤2:修改 hugegraph.propertiesbackend=rocksdbserializer=binaryrocksdb.data_path=.rocksdb.wal_path=.步骤3:初始化数据库(仅第一次启动时需要)cd hugegraph-${version}bin/init-store.sh步骤4:启动serverbin/start-hugegraph.shStarting HugeGraphServer…Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)….OK步骤5:查看服务状态:jps6475 HugeGraphServer# curl请求restuflAPI,结果返回200,代表server启动正常echo curl -o /dev/null -s -w %{http_code} "http://localhost:8080/graphs/hugegraph/graph/vertices"步骤6:# 停止server$cd hugegraph-${version}$bin/stop-hugegraph.sh4.2 安装HugeGraph-Studio步骤1:# 下载tar包并解压wget https://github.com/hugegraph/hugegraph-studio/releases/download/v${version}/hugegraph-studio-${version}.tar.gztar zxvf hugegraph-studio-${version}.tar.gz步骤2:修改配置文件hugegraph-studio.properties将配置项studio.server.host的值localhost修改成机器名或 IP,这是 HugeGraphStudio 对外提供服务的host,如果只需要本地访问则保持不变即可;将配置项studio.server.port的值8088修改成想要的端口,这是 HugeGraphStudio 对外提供服务的port;将配置项graph.server.host的值localhost修改成 HugeGraphServer 的host,HugeGraphStudio 通过此项和graph.server.port与 HugeGraphServer 建立连接;将配置项graph.server.port的值8080修改成 HugeGraphServer 的port,HugeGraphStudio 通过graph.server.host和此项与 HugeGraphServer 建立连接;将配置项graph.name的值hugegraph修改成要连接的 HugeGraphServer 的图名,目前只允许连接一个图。# 启动HugeGraph-Studio$ cd hugegraph-studio-${version}$ bin/hugegraph-studio.sh步骤3:浏览器打开:http://localhost:8088即可访问。五、HugeGraph,Neo4j,Titan三种图数据库性能对比官网给了一个性能测试的报告:https://hugegraph.github.io/h…总结起来就是:批量插入性能:HugeGraph(RocksDB) > Neo4j > Titan(thrift+Cassandra)遍历性能:Neo4j > HugeGraph(RocksDB) > Titan(thrift+Cassandra)图常用分析方法性能:FS场景,HugeGraph性能优于Neo4j和Titan,K-neighbor和K-out场景,HugeGraph能够实现在5度范围内秒级返回结果社区聚类算法性能 Neo4j > HugeGraph > Titan当时选择HugeGraph的原因一是需求需要导大量的数据,涉及大约十几亿的插入,所以需要找一个插入性能高的,并且好友关系变动的时候也需要异步更新图关系。而是HugeGraph虽然是新秀,但是中文官方文档很简介清楚,利于学习使用。参考:https://hugegraph.github.io/h… Apache ThinkerPop 3是图形数据库(OLTP)和图形分析系统(OLAP)的图形计算框架。 ↩ Gremlin是Apache ThinkerPop框架下的图遍历语言,Gremlin是一种函数式数据流语言,可以使用户使用简洁的方式表述复杂的属性图的遍历或查询。 ↩ ...

January 28, 2019 · 1 min · jiezi

GraphQL 科普 前端向

简介GraphQL是基于「类型系统」来执行查询的查询语言。Facebook 2012 年开始使用 GraphQL,15年开源。graph定义了一套标准,用于描述服务端和客户端的通信。可以使用任意语言来实现graph所描述的功能。就和ECMAScript标准之于JavaScript一样。样例前端传入字段和结构。后台按照前端的需求返回数据。一个GraphQL请求由两部分组成。 操作符 和 文档。操作符GraphQL作为前后台交互的中间层,不能只有查询功能,在REST中,有GET、POST、DELETE等类型的请求。GraphQL则将前后台通信直接分为两大类 query和mutation。query顾名思义,query是默认的操作符,代表查询,是不会给服务端带来副作用的请求。没有操作符的话会默认是query操作符,上面的动图就是省略了query操作符。 完整的请求其实是这样的。query { hero { name }}mutationmutation代表一个动作,会给服务器带来修改。比如增删改。例如:mutation addMessage($input: MessageType!) { addMessage(input: $input) { id text }}返回结果{ “addMessage”: { “label”: “测试的一个message”, “id”: “0RaqSeOL0” }}对($input: MessageType!) 可能会一头雾水,这写只是定义传参的一些语法,过过文档就可以学会。subscriptionsubscription, 订阅操作符还未纳入标准,但是已经被实现应用了。订阅操作符的功能是像服务端监听一个操作。就像VUE里面的watch一样。只是我们watch的是服务端。一旦服务端发生了我们订阅的改变,服务端就会主动把变化推送给我们。自己的业务代码里面再也不要维护什么轮询,定时器啦。文档文档部分:{ hero { name height }}文档就是前端向后台描述所需的字段。也是前端觉得最爽的地方,数据结构清晰明了。发送什么样的请求,拿到什么样的数据。观察文档,文档是由 类型 和 字段 构成的。GraphQL是强类型语言。如果使用过typescript就很好理解。可以认为,我们规定了一种对象,它们一定有定义的属性。hero就是一个类型。name 和 height就是字段。特点获取多类资源,只用一个请求。前端控制:是客户端指定的查询,端从被动为主动,想要什么拿什么。层次结构化: 操作粒度为字段级别,可读性好,查询的结构和结果非常相似。开发友好:得益于强类型,GraphQL可以在编写代码时就检查语句是否错误,也能智能提示类型下的字段。可以自动生成文档,提供丰富的体验。降低前后端沟通成本。和REST对比随着系统发展,REST的接口持续平面增长,GraphQL 只需增加类型,更加利于维护。如果是复杂的客户端,一个页面往往需要调用多个接口,GraphQL 只需调用一次即可,一次请求到所有数据。REST 所操作的资源相对是离散的(接口接口接口),GraphQL的数据更有整体性(因为是类型构成)。社区框架目前前端客户端主要有Apollo和Relay,他们的作用就和axios一样,方便我们构造请求。因为业务中主要用到vue,有vue-apollo所以我选择的是Apollo。vue-apollo自带了store层,方便进行数据缓存,vuex也可以去掉了。资料我用vue-cli生成了一个简单的增删改查的项目。 可以对照着文档自己敲代码。 GraphQL_demo文章阻碍你使用 GraphQL 的十个问题30分钟理解GraphQL核心概念RPC vs REST vs GraphQL文档graphql官方文档vue-apollo文档apollo文档github的graph样例接口(在线把玩)

January 5, 2019 · 1 min · jiezi