版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文档数据库MongoDB的原理与应用提纲5.1MongoDB简介5.2MongoDB基本概念5.3MongoDB的安装和配置方法5.4MongoDB的基本操作5.5MongoDB基于图形化管理工具的数据库查询方法5.6MongoDB基于Python的数据库连接和查询5.7MongoDB的维护MongoDBisadocumentdatasetdesignedforeaseofapplicationdevelopmentandscaling.MongoDB是一个文档数据库,旨在简化应用程序开发和扩展。5.1MongoDB简介是什么文档数据库官网解释详细解释MongoDB是一个文档数据库,将数据存储为类似于JSON的文档(BSON),数据结构由键-值(key-value)对组成,可存储各种复杂数据类型。除支持基础的数字、字符串、布尔值外,还支持数组、文档等。5.1MongoDB简介优点数据类型丰富:支持多种数据类型结构灵活:无需像关系型数据库提前声明文档结构,可以灵活添加和删除字段性能优越:支持完全索引,即可以对文档中任何对象进行索引可扩展性强:文档被视为单个单元,这意味着可以分布在多个服务器缺点事务隔离等级不足:目前仅支持副本集事务和分布式事务,无法适用于关键业务场景(如银行)占用内存过大:每次空间不足时,会申请一大块硬盘空间;同时删除记录并不释放空间,仅标记为“已删除”5.1MongoDB简介发展历程MongoDB创始人1995年Dwight和Kevin曾工作于著名在线广告公司DoubleClick。几年内广告流量达到每秒40万条,当时关系型数据库配备如此规模的关系型数据库需要大量的资金和硬件资源。2003年Eliot加入DoubleClick。随着广告流量越来越大,他们都意识到,正在一次又一次地解决同样的水平伸缩性问题。2007年,他们共同创办了一家叫做10gen(后改名为MongoDB)的公司。在水平伸缩方面,使用自动分片功能构建大型MongoDB集群。至今,MongoDB下载量达到1.1亿次。思科正使用MongoDB取代Oracle重构电商平台,字节跳动也将部分MySQL应用迁移到MongoDB。MongoDBHistory:
/mongodb/mongodb-history.html5.1MongoDB简介应用场景电商应用商品信息、订单信息借助于MongoDB支持数据类型丰富等特点,通过嵌套的子文档,一次简单查询就能获取所需的信息,无需多表join查询。移动应用MongoDB支持二维空间索引,高效查询地理位置关系和检索用户地理位置数据,从而支撑基于地理位置查询的移动类App的业务需求。物流应用MongoDB存储订单信息,订单状态在运送过程不断更新,以MongoDB内嵌数组存储,一次查询即可读取订单所有变更。5.2MongoDB基本概念MongoDB与关系型数据库相关概率对比关系型数据库MongoDB数据库(dataset)数据库(dataset)表(table)集合(collection)行(row)文档(document)列(column)字段(field)MongoDB命名规则统一命名规则(1)不能为空字符串(2)不得有空格、$、\和空字符特殊命名规则(1)数据库名和文档键中不得有
点(.)(2)数据库名中字母必须全为小写字母(3)集合名不能以system开头,因为这是为系统集合保留的前缀(4)以下划线(_)的键为系统保留的键5.2MongoDB基本概念数据库默认数据库admin:可理解为root数据库。一些特定服务器端命令只能通过该数据库运行,如:关闭服务器。
local:该数据库永远不会被复制,可用来存储本地单服务器的任何集合。config:当MongoDB用于分片设置时,该数据库在内部使用,用于保存分片相关信息。集合文档MongoDB文档组,类似于关系数据库的表格。集合没有固定的结构,意味着可以对集合插入不同格式和类型的数据。由若干键-值对组成。如{"name":"小明","age":21,"major":"计算机科学与技术"}
5.2MongoDB基本概念MongoDB的数据类型数据类型描述String字符串。MongoDB中只有UTF-8编码的字符串合法Integer整型数值。根据采用的服务器,可分为32位或64位Boolean布尔值。用于存储布尔值(真/假)Double双精度浮点数。MongoDB中默认浮点数存储格式为双精度浮点数Array用于将数组、列表或多个值存储为一个键或值Object用于内嵌文档Null用于创建空值Data日期时间。可以指定日期时间:创建Date对象,传入年月日信息ObjectId对象ID。用于创建文档的IDObjectId各字节的具体含义5.3MongoDB的安装和配置方法参考教材官网:/docs/manual/installation/MongoDB服务启动命令:dockerrun-d--namemongo–p27017:27017mongo:5.0.6
MongoDB客户端连接命令:dockerexec–itmongomongo5.4MongoDB的基本操作-数据库数据库创建命令示例:useagr_products_ecommerce_db数据库查询查询所有数据库:showdbs查询当前数据库:db数据库删除删除当前数据库:db.dropDatabase()5.4MongoDB的基本操作-集合集合创建创建命令:db.createCollection(name,option),具体参数说明name:必须,创建集合的名称options:可选,指定有关内存大小及索引字段数据类型描述capped布尔若为true,则创建固定集合。当集合达到最大值时,会自动覆盖最早的文档。注意:该值为true时,必须指定size参数size数值为固定集合指定一个最大值,即字节数max数值指定固定集合中包含文档的最大数量options参数表示示例:db.createCollection(“products”,{max:100,capped:true,size:5000})5.4MongoDB的基本操作-集合集合查询查询命令:show
collections
(show
tables)集合删除删除命令:db.collection().drop()collection:需要删除的集合名。若成功删除返回true,否则返回false5.4MongoDB的基本操作-文档文档格式BSON格式(一种类似于JSON的格式)。其中key,value均可为任何数据类型格式,包含文档子对象。5.4MongoDB的基本操作-文档文档添加插入单个文档:insert插入多个文档:insertMany5.4MongoDB的基本操作-文档文档查询查询命令:db.collection.find(query,projection),其中collection表示查询的集合名。参数说明:query:可选,使用查询操作符指定查询条件projection:可选,使用投影操作符指定返回的键。索要查询所有键值,则省略(默认省略)文档查询类型说明条件查询条件判断查询,类似与关系型数据库的where语句AND/OR查询与传统关系数据库中的AND、OR查询类似$type查询通过数据类型查询排序查询使用sort()方法对查询结果指定排序顺序分页查询使用limit()和skip()方法实现分页查询索引查询建立索引,并通过索引查询聚合查询主要用于处理数据(如统计平均值、求和、最值等)其他查询如数组中的查询、模糊查询、去重、指定返回字段等5.4MongoDB的基本操作-文档文档条件查询MongoDB条件操作符与传统关系型数据库where语句对比操作格式示例关系型数据库类似语句等于{<key>:<value>}ducts.find({“product_name”:“菠菜”})whereproduct_name=“菠菜”小于{<key>:{<$lt:<value>}}ducts.find({“price”:{$lt:0.6}})whereprice<0.6小于或等于{<key>:{$lte:<value>}}ducts.find({“price”:{$lte:0.6}})whereprice<=0.6大于{<key>:{$gt:<value>}}ducts.find({“price”:{$gt:0.6}})whereprice>0.6大于或等于{<key>:{$gte:<value>}}ducts.find({“price”:{$gte:0.6}})whereprice>=0.6不等于{<key>:{$ne:<value>}}ducts.find({“price”:{$ne:0.6}})whereprice!=0.65.4MongoDB的基本操作-文档文档AND/OR查询AND查询:db.collection.find({key1:value1,key2:value2})OR查询:db.collection.find({$or:[{key1:value1},{key2:value2}]})AND查询示例OR查询示例5.4MongoDB的基本操作-文档文档$type查询支持多种数据类型,如Double,String,Object等查询示例:ducts.find({“product_name”:{$type:‘string’}})文档排序查询可使用sort()方法对数据进行排序,通过参数指定排序的字段,并使用1和-1指定排序方式(1:升序排列,-1:降序排列)查询示例:ducts.find().sort({“price”:1})分页查询limit():db.collection.find().limit(number),参数说明:number表示从MongoDB读取的记录条数skip():db.collection.find().limit(number1).skip(number2),参数说明:number1:同limit(),number2:表示跳过的记录数查询示例:ducts.find().limit(1).skip(2)5.4MongoDB的基本操作-文档文档索引查询索引可以极大地提高查询效率。如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。MongoDB在集合层面定义了索引,并支持对任何字段(包括子文档)进行索引。具体索引内容,读者请查阅书稿及相关资料。5.4MongoDB的基本操作-文档文档聚合查询MongoDB的聚合主要用于处理数据(如统计平均值、求和等),并返回计算后的数据结果,类似于关系型数据库的count(*)语句表达式说明$sum计算总和$avg计算平均值$min获取集合中所有文档对应值的最小值$max获取集合中所有文档对应值的最大值$push将值加入一个数组中,不会判断是否有重复的值$addToSet将值加入一个数组中,会判断是否有重复的值。若相同的值在数组中已经存在,则不加入$first根据资源文档的排序获取第一个文档的数据$last根据资源文档的排序获取最后一个文档的数据5.4MongoDB的基本操作-文档文档更新基本语法格式:db.collection.update(query,update,{upset:<Boolean>,multi:<boolean>,writeConcern:<document>})参数说明:query:必选,查询条件update:必选,待更新的对象和一些更新的操作符(如$)等upset:可选,表示如果不存在update的记录,是否插入新的对象,true表示插入,false表示不插入,默认为falsemulti:可选,MongoDB默认为false,表示只更新找到的第一条数据,如果为true,则表
示对查询到的所有数据进行更新writeConcern:可选,表示抛出异常的级别更新示例:ducts.update({“product_name”:“西红柿”},{$set:
{“price”:2.5}},{multi:true})5.4MongoDB的基本操作-文档文档删除基本语法格式:db.collection.remove(query,justOne:<boolean>,writeConcern:<document>})参数说明:query:可选,查询条件(不指定则删除所有文档)justOne:可选,如果设为true或1,则只删除一个文档。默认为false,即删除所有匹配条件的文档writeConcern:可选,抛出异常的级别删除示例:ducts.remove({“product_name”:“西红柿”})5.4MongoDB的基本操作-文档文档结构修改MongoDB作为文档数据库,除能像传统关系数据库一样实现基础的增、删、改、查外,还能轻松实现修改文档字段等操作。重命名文档字段删除文档字段新增文档字段5.5MongoDB基于图形化管理工具的数据库查询方法MongoDBCompass官网:/zh-cn/products/tools/compass5.6MongoDB基于Python的数据库连接和查询PyMongoPyMongo为Python提供的操作MongoDB数据库的安装包,基于PyMongo能够非常方便地操作MongoDB数据库。安装:pipinstallpymongoPyMongo连接MongoDBPyMongo对文档CURD操作见书稿及实验手册5.7MongoDB的维护MongoDBDatabaseToolsMongoDB提供MongoDBDatabaseTools,支持对MongoDB进行各种维护操作。下载地址:/try/download/database-tools5.7MongoDB的维护MongoDB数据导入基本命令格式:mongoimport–d数据库名–c集合名--typecsv|json--file文件路径d:需要导入数据的数据库,如果数据库不存在,则会自动创建c:需要导入数据的集合,如果不存在于数据库中,同样会自动创建type:导入数据的文件格式,支持csv和json格式file:存储数据的文件路径示例:mongoimport–dagr_products_ecommerce_db–cproducts--typejson--fileE:\MongoDB\input\products_input.json5.7MongoDB的维护MongoDB数据导出基本命令格式:mongoexport–d数据库名–c集合名-ffield1,field2...–q查询条件–o导出的文件路径d:需要导出数据的数据库c:需要导出数据的集合f:需要导出数据的字段q:导出数据的查询条件o:导出数据存储的文件路径示例:mongoexport–dagr_products_ecommerce_db–cproducts-oE:\MongoDB\output\products.json5.7MongoDB的维护MongoDB数据备份基本命令格式:mongodump–h
dbhost–d数据库名–o导出的文件路径h:需要备份的服务器ip及端口(若不指定则默认为本地服务器的27017端口)d:需要备份的数据库名o:备份数据存储的文件夹路径示例:mongodump–h–dagr_products_ecommerce_db-oE:\MongoDB\output\mongodump5.7MongoDB的维护MongoDB数据恢复基本命令格式:mongorestore–h
<hostname><:port>–ddbname
<path>host<:port>,h<:port>:
MongoDB所在服务器地址,默认为localhost:27017db,d:需要恢复的数据库名(这个名词可以和备份时候的名词不相同)drop:若指定,恢复的时候先删除当前数据,然后恢复备份的数据<path>:指定备份数据所在目录(可选项)dir:指定备份数据的目录(注意:不能同时指定path和dir选项)示例:mongorestore–hlocalhost:27017–dagr_products_ecommerce_dbE:\MongoDB\output\mongodump\db5.8MongoDB总结与其他数据库对比名称类型数据存储选项查询类型附加功能MongoDB基于硬盘的非关系型文档存储数据库无
schema
的
BSON
文档创建、读取、更新、删除、条件查询等复制、分片、空间索引等MySQL关系型数据库数据表、视图等查询、插入、更新、删除、内置函数、自定义存储过程等支持
ACID
性质、复制等Redis基于内存的非关系型数据库字符串、列表、集合、哈希、有序集合针对数据类型有专属命令,另有批量操作和不完全的事务支持发布与订阅、复制、持久化、脚本扩展memcached基于内存的键值缓存键值映射创建、读取、更新、删除等多线程支持总结在本章我们学习了MongoDB文档数据库的特点和用途了解了MongoDB的基本概念:集合和文档等系统学习了MongoDB的数据类型和对数据库、集合和文档的增删改查操作重点学习了MongoDB文档的各种查询方法MongoDB的docker的本地和云端配置方法学习了基于图形化管理工具的MongoDB操作方法学习了基于Python的MongoDB数据库编程方法学习了MongoDB的数据导入、导出、备份和恢复等数据库维护操作第6章图数据库Neo4j的原理与应用提纲6.1图数据库简介6.2图数据库Neo4J简介6.3Neo4J的相关基本概念6.4Cypher语言基础6.5Neo4J的安装和配置方法6.6Neo4J的基本操作6.7Neo4J的基于图形化管理工具的查询方法6.8Neo4J的基于Python的数据库连接和查询6.1图数据库简介图数据库是一种专门用于存储和查询关系的数据库。虽然现有的关系型数据库可以存储实体之间的关系,但它们使用昂贵的JOIN操作或交叉查找来查询这些关系。图数据库存储的是节点和关系,而不是表或文档,因此图数据库是一类非关系型数据库。在图形数据库中,没有JOIN操作或交叉查找。关系以一种更灵活的格式与数据元素(节点)一起本地存储。系统的一切都为快速遍历数据而优化,通常每核每秒能处理数百万个连接,这在传统的关系型数据库中是很难实现的。图数据库中的每个节点可以有任意数量和类型的关系。而每条边总是有开始节点、结束节点、类型和方向。6.2图数据库Neo4J简介Neo4j是由Neo4j股份有限公司开发的图数据库管理系统。是当前(2022年)在世界范围内的一种主流的图数据库。Neo4j的基础功能是开源的,但有些高级功能是闭源的。免费版的功能已经可以满足初学者和常规中小型应用的基本需求。Neo4j是用Java语言实现的,这就是其名称中包含“j”的原因。但Neo4j同样可以通过支持事务的HTTP或二进制“Bolt”协议从其他语言编写的软件访问,比如Python语言。6.3Neo4J的相关基本概念节点、关系和属性在Neo4j中,信息被组织为节点(node)、关系(relation)和属性(property)。节点是图中的实体。节点可以用标签(label)进行标记,也可以包含任意数量的键-值对或属性。关系提供了两个节点实体之间的有向的、命名的连接。关系总是有一个方向、一个类型、一个开始节点和一个结束节点,它们可以像节点一样具有属性。节点可以具有任意数量或类型的关系。6.3Neo4J的相关基本概念系统数据库和默认数据库新安装的Neo4j数据库系统中会默认内置两个数据库,分别是系统数据库和默认数据库。前者负责存储与系统运行参数和安全性配置有关的信息。后者负责存储用户输入的图数据。前者的名字是system,后者的名字是Neo4j。在免费版的Neo4j中,只支持用户使用这个名为Neo4j的默认数据库来存储和管理数据。在收费的商业版Neo4j中,支持创建多个用户数据库。这个名为Neo4j的默认数据库(defaultdatabase)有时也被称为homedatabase,因为所有用户录入的图数据都默认存放在这个数据库中。只能有一个用户数据库对于我们学习图数据库而言也是足够了,甚至对于常规的图数据库应用而言也是足够的6.3Neo4J的相关基本概念Cypher查询语言Cypher之于Neo4j就如同SQL之于openGauss。Cypher是Neo4j图形数据库的查询语言,是一种声明式模式匹配语言,遵循与SQL类似的语法。与SQL类似,Cypher也有执行数据库操作的命令。它支持许多子句,如WHERE、ORDERBY等。它还支持一些函数来处理字符串和进行聚合统计。6.4Cypher语言基础常用数据类型数据类型说明Boolean保存布尔类型数据,值为true或falsebyte保存8-bit的整数short保存16-bit的整数int保存32-bit的整数long保存64-bit的整数float保存32-bit的浮点数double保存64-bit的浮点数char保存用2字节编码的字符String保存字符串6.4Cypher语言基础用于读取和查询信息的子语句子语句关键字说明MATCH以某种条件来查询数据OPTIONALMATCH与match作用基本相同,唯一的区别是它可以在条件存在部分缺失的情况下用空值来代替缺失的条件来完成查询。WHERE用来添加查询条件LOADCSV该子句用于从CSV文件导入数据6.4Cypher语言基础用于修改和写入信息的子语句子语句关键字说明CREATE此子句用于创建节点、关系和属性MERGE此子句验证图中是否存在指定的模式。如果没有,它将创建此模式SET此子句用于更新节点上的标签、节点上的属性,以及关系DELETE此子句用于从图中删除节点、关系等REMOVE此子句用于从节点和关系中删除属性等元素FOREACH此子句用于从节点和关系中删除属性等元素6.4Cypher语言基础其他常用的子语句子语句关键字说明RETURN此子句用于定义查询结果集中包含的内容ORDERBY此子句用于按顺序排列查询的输出。它与子句RETURN或with一起使用LIMIT此子句用于将结果中的行数限制为特定值SKIP此子句用于定义从哪一行开始,包括输出中的行WITH此子句用于将查询部分链接在一起UNWIND此子句用于将列表展开为行序列。UNION此子句用于组合多个查询的结果.CALL此子句用于调用部署在数据库中的过程6.4Cypher语言基础常用操作符类型操作符数学运算+,-,*,/,%,^比较+,<>,<,>,<=,>=逻辑AND,OR,XOR,NOT字符串+列表+,IN,[X],[X…..Y]正则表达式=-字符串匹配STARTSWITH,ENDSWITH,CONSTRAINTS6.5Neo4J的安装和配置方法拉取Neo4j的官方Docker镜像开启一个命令行,输入下面的命令,就可以把Neo4j的官方镜像拉取到本地了:安装镜像并运行容器在命令行中运行下面的语句可以在容器内安装Neo4j的镜像并启动运行:这里也是用--name参数来指定容器的名字,并用位于语句末尾的Neo4j指定镜像的名字。用了“-d”参数来让容器在背景中持续运行,不至于在命令行窗口被关闭后就被迫停止。连续用了两个--publish参数分别定义了两个端口7474和7687。这两个端口一个是为基于Web的图形化管理工具来访问Neo4j数据库(将在6.6节中叙述),一个是为了Python语言通过Bolt协议来访问Neo4j数据库(将在6.7节中叙述),都是必不可少的。dockerpullneo4jdockerrun--nameneo4j-d--publish=7474:7474--publish=7687:7687--volume=$HOME/neo4j/data:/dataneo4j6.5Neo4J的安装和配置方法在华为云主机上配置Neo4j的通信端口规则在华为云的控制台页面中单击其中的“弹性云服务器”,在随后的界面中找到云主机,来到主机的详细信息页面,单击其中的安全组,来到安全设置页面;再单击其中的“配置规则”链接,来到端口规则配置页面。6.5Neo4J的安装和配置方法在华为云主机上配置Neo4j的通信端口规则分别点击入方向规则和出方向规则,单击其中的“添加规则”按钮,尝试把7474端口和7687端口添加为可访问;6.6Neo4J的基本操作进入Neo4j的命令行环境在Docker平台所在的主机上,运行下面的命令:要进入neo4j的命令行环境,我们需要在随后的提示符井号#后面输入:为了安全起见,需要我们修改初始密码才能继续。遵从该建议,可以输入一个新的密码,比如“neo4_j”,即在4和j之间加一个下画线,这样既容易记,也容易写,便于我们在学习时方便地连入Neo4j。通过后,会看到cypher的命令提示符,“neo4j@neo4j>”就是Cypher的命令行提示符,我们可以在这个提示符后面输入Cypher指令了。dockerexec-itneo4jbashbin/cypher-shell-uneo4j-pneo4j6.6Neo4J的基本操作创建节点和属性创建单个节点:创建多个节点:node1和node2是占位符;虽然这里只写了2个占位符,其实可以写更多的。占位符可以省略,但括号不能;括号之间的英文逗号不能,最后的分号也不能省略。CREATE(node1);CREATE(node1),(node2);6.6Neo4J的基本操作创建节点和属性创建带标签的节点:标签一般标记节点所代表信息的类型,比如表示人的节点,我们可以用“person”来作为标签;表示轿车的节点,可以用“car”来做标签;一个节点可以有多个标签,如果要创建这样的节点,可以使用下面的语法:CREATE(node:label);CREATE(node:label1:label2:....labeln);6.6Neo4J的基本操作创建节点和属性创建带属性的节点:如果说标签表示了节点的类型,那属性就刻画了节点的特征信息。创建带属性节点的语法为:其中与创建带标签节点的语法不同的是:多了一个花括号,以及花括号里面用英文逗号分隔的键值对。这些键值对就是节点的属性。其中“键”反映了属性的名称,“值”反映了属性的值。CREATE(node:label{key1:value,key2:value,.........});6.6Neo4J的基本操作创建节点和属性返回创建的节点:如果我们只是想在创建节点后马上看到新增节点的基本信息,则可以用这里描述的语法:与前面的create语句不同的是,它多了一个RETURN子语句,可以把占位符表示的节点返回到命令行显示。在这种场景下,占位符终于起到作用了。CREATE(Node:Label{properties....})RETURNNode;6.6Neo4J的基本操作创建关系关系的创建也是通过CREAT语句,但其语法与创建节点时不同:其语法结构是:节点-关系-节点。左侧和右侧的节点一般是已经存在的节点,否则系统会自动创建节点。node1代表左侧节点的变量名,node2是代表右侧节点的变量名。node1和node2一般都是通过查询语句获得的,也可以在这个CREATE语句中创建。左侧节点和关系之间有一个英文的横杠符号,关系和右侧节点之间有一个由横杠和大于号组成的箭头,通过这种方式来指明关系的方向和连接的对象。而关系本身的标签(也叫关系的类型)和属性都在方括号中,其写法与节点类似。CREATE(node1)-[:RelationshipType{key1:value1,key2:value2}]->(node2)6.6Neo4J的基本操作查询查询主要通过match命令来实现。如果我们想查询数据库中所有的节点,可以用这条命令来实现:这是match命令的典型用法:以match开头,说明要开启查询;后面跟着一个代表任意节点的“(n)”没有对这个节点的标签或属性做任何限制,所以结合return命令返回的是所有节点。如果我们想返回特定标签的节点,比如所有person标签的节点。可以这样写:MATCH(n)RETURNn;match(n:person)returnn;6.6Neo4J的基本操作查询查询主要通过match命令来实现。还可以按标签和属性查找,如查找名叫xiaohong的标签为person的节点:这条语句还可以改写为带WHERE子语句的写法:这两种写法起到的作用是相同的,但带where子语句的写法一般可以接入更多的约束条件,可以实现更加灵活的查询。注意在where子语句中,访问节点的属性时,应该用“.”而不是“:”。match(n:person{name:'xiaohong'})returnn;match(n:person)where='xiaohong'returnn;6.6Neo4J的基本操作查询查询主要通过match命令来实现。按关系查询节点比如我们想查询跟name属性为xiaohong的节点有关系的其他节点,可以这样写:在这条语句里,match后面跟着“节点-关系-节点”这样的构型。其中左侧节点是被限定为name为xiaohong的节点;关系是用空的方括号表示,意味任何类型的关系;右侧节点没有施加任何标签和属性约束,只有一个变量名n2,而return返回的是变量n2,意为右侧的节点。这条语句可以找到从左侧节点发出的指向右侧节点的所有关系。match(n{name:'xiaohong'})-[]->(n2)returnn2;6.6Neo4J的基本操作编辑节点和关系对于现存的节点和关系,有两类常见的编辑功能,分别是:修改和删除。对于修改,常用set命令,对于删除常用delete和remove命令。set命令的用法set一般不单独使用,而是跟随着match指令使用的。比如我们想给数据库中现有的标签为person且name属性为xiaohong的节点增加一个新的字段gender,表示其性别。则可以用这条语句实现:match(n:person{name:'xiaohong'})setn.gender='female'returnn;6.6Neo4J的基本操作编辑节点和关系set命令的用法我们可以修改现有节点的现存属性,也可以新增属性。除了编辑属性之外,还可以编辑标签。比如我们可以用下面的命令,将xiaohong对应的节点新增一个标签teacher,同时把它的birthday属性修改为“1996-5-1”,并给它新增一个phone属性,值为“1988665556”。则可以用这条语句实现:match(n:person{name:'xiaohong'})setn:teacher,n.birthday='1996-5-1',n.phone='1988665556'returnn;6.6Neo4J的基本操作编辑节点和关系delete和remove指令两者都是实现删除功能,但前者是删除节点和关系,后者是删除标签和属性。如果我们想删除xiaohong节点中的phone属性,则应该用remove指令。其语法与set类似,也是先用match来查询节点,然后把remove作为子语句跟在后面,指定要删除的属性,然后返回被修改的节点:同样,我们也可以用remove指令来删除标签:match(n:person{name:'xiaohong'})removen.phonereturnn;match(n:person{name:'xiaohong'})removen:teacherreturnn;6.6Neo4J的基本操作编辑节点和关系delete和remove指令如果要删除某个节点,则需要使用delete语句。比如要删除所有节点,可以这样写:match后面没有对节点n进行任何限定,所以是无差别的删除所有节点。删除节点除了使用delete之外,还要在其前面加上detach语句,意思是先从图中分离,再删除。如果我们删除前面创建的name为zhangsan的节点,可以这样写:这条语句除了删除了该节点,也删除了所有依附在该节点上的关系。MATCH(n)DETACHDELETEnmatch(n:person{name:'zhang
san'})detachdeleten;6.6Neo4J的基本操作编辑节点和关系对边和关系进行编辑如果创建某条边,可以使用create语句。比如让我们把前面删除的节点重新创建,并把它和xiaohong节点的关系也重建起来:然后让我们尝试给这个关系新增一个属性marry_date,可以仿照前面针对节点的set代码来写,只是要在match语句中增加对关系的查询,并给关系一个变量名,如下:create(n:person{name:'zhangsan',birthday:'1993-5-1'});match(n1),(n2)where='xiaohong'and='zhangsan'create(n1)-[r:wife_of]->(n2)returnn1,r,n2;match(n1:person{name:'xiaohong'})-[r:wife_of]->(n2)setr.marry_time='2018-5-1'returnr;6.7Neo4J的基于图形化管理工具的查询方法图形化管理工具的必要性前面讲解的cypher的命令行工具,虽然可以方便地执行命令,但返回的结果是基于字符的,不能直观反映节点与节点之间的拓扑关系。Neo4j官方提供了基于Web的图形化查询工具,可以让我们方便地编写和运行cypher指令,并直观的查看图结构。启动和登录图形化管理工具如果你的Neo4j数据库是安装在本地机器,则可以打开浏览器并输入:7474就可以访问这个图形化管理工具了。如果你的Neo4j数据库是安装在云端主机,比如像6.5.3所示的那样是安装在华为云主机上的。则你需要打开浏览器,在地址栏输入你华为云主机的公网ip地址并跟上7474这个端口号。6.7Neo4J的基于图形化管理工具的查询方法启动和登录图形化管理工具初次打开首页时,需要进行登录。在username和Password这两个文本框中输入登录默认数据库Neo4j的用户名和密码。新安装的Neo4j数据库的初始用户名和密码都是Neo4j。如果你跟随我在6.6.1节中进行了密码修改,则应该按照新的密码neo4_j登录。6.7Neo4J的基于图形化管理工具的查询方法在图形化环境中执行查询在界面上方的neo4j$提示符文本框中输入查询指令并按回车键,查看数据库中现有的所有标签为person的节点:其运行结果如图所示:match(n:person)returnn;它通过圆形体现了符合查询条件的节点,也通过直线表示了节点之间的联系,如果单击某个节点或边,还可以在右侧信息栏里显示该对象的属性。6.7Neo4J的基于图形化管理工具的查询方法在图形化环境中查看教程并演练Neo4j在这个图形化的管理工具中还内置了互动式的教学资源,供初学者在示例中学习。启动的方式就是单击首页左边栏中的“Guides”图标。单击该图标后,学习资源列表就展开在你面前:可见里面内置了多个教程,每一个教程都是互动性的,即在图形化管理工具界面中会启动提示,引导你一步步操作来完成教程。6.8Neo4J的基于Python的数据库连接和查询安装驱动库Neo4j官方提供了让Python连接Neo4j数据库的驱动库;用Pyhton的pip指令来安装,具体命令为:连接数据库需要导入Neo4j这个驱动包中的GraphDatabase对象;并通过GraphDatabase对象的driver函数来生成一个驱动对象。python-mpipinstallneo4jfromneo4jimportGraphDatabaseuri="neo4j://:7687"driver=GraphDatabase.driver(uri,auth=("neo4j","neo4_j"))6.8Neo4J的基于Python的数据库连接和查询执行cypher指令要执行cypher指令,首先要通过驱动对象创建一个会话session对象;后通过调用session对象的execute_read函数或execute_write函数来执行cypher指令:但麻烦的是session.execute_read函数和session.execute_write函数都不能直接接受cypher语句去执行,而是必需调用另外一个中间函数去执行cypher指令。假设我们已经定义了一个这样的中间函数get_all_nodes,则可以通过下面的代码来调用:其中的for循环用来输出查询结果withdriver.session()assession: result=session.execute_read()withdriver.session()assession:nodes=session.execute_read(get_all_nodes)fornodeinnodes:print(node)6.8Neo4J的基于Python的数据库连接和查询执行cypher指令中间函数的结构:这个中间函数的函数名是任意的,参数数量也是任意的;只是它最少有一个参数,一般命名为tx,而且这个参数的值不需要我们输入。Neo4j的Python驱动会在这个中间函数被调用时自动给它的第一个参数tx赋值一个特殊的对象,这个对象有个函数run,它可以接受并运行cypher指令。defget_all_nodes(tx):
cypher_str="""
match(n)returnn;"""nodes=[]result=tx.run(cypher_str)fornodeinresult:
nodes.append(node)returnnodes6.8Neo4J的基于Python的数据库连接和查询执行cypher指令带参数的查询:Neo4j的Python驱动支持在cypher语句中插入参数,参数值在运行时可以动态编辑。其语法很简单,就是在cypher代码字符串中用$开头的符号来代表待定参数,并在tx.run函数的参数中设定参数值。defget_all_nodes(tx,name):
cypher_str="""match(n)where=$name_parareturnn;"""nodes=[]result=tx.run(cypher_str,name_para=name)fornodeinresult:
nodes.append(node)returnnodes总结在本章我们学习了图数据库的特点和用途了解了Neo4j图数据库的基本概念:节点、关系和属性,以及Cypher查询语言系统学习了Cypher语言中的数据类型和对数据的编辑查询命令的语法Neo4j的docker的本地和云端配置方法基于示例展示了Cypher语言的使用方法学习了基于图形化管理工具的查询方法学习了基于Python的图数据库编程方法键值数据库Redis的原理和应用7.1Redis简介7.2基本概念与设计原理7.4Redis数据库创建方法7.3Redis数据库的安装和配置方法7.5Redis基本操作指令7.6Redis的基于图形化管理工具的数据库查询方法目录CONTENTS737.7Redis的基于Python的数据库连接与查询7.8Redis的维护7.9总结
Redisisanopensource(BSDlicensed),in-memory
datastructurestore
usedasadatabase,cache,messagebroker,andstreamingengine.Redisprovides
datastructures
suchas
strings,
hashes,
lists,
sets,
sortedsets
withrangequeries,
bitmaps,
hyperloglogs,
geospatialindexes,and
streams.Redishasbuilt-in
replication,
Luascripting,
LRUeviction,
transactions,anddifferentlevelsof
on-diskpersistence,andprovideshighavailabilityvia
RedisSentinel
andautomaticpartitioningwith
RedisCluster。Redis是一个基于内存的键值型数据存储结构(工作位置),它可用作数据库、缓存、消息代理和流引擎(用途)。它支持多种数据结构。Redis内置了复制、事务和不同级别的磁盘持久化等机制。7.1Redis简介是什么RemoteDictionaryServer(远程字典服务器)官网解释计算高效数据结构丰富,操作简单稳定,数据可持久到磁盘7.1Redis简介优点支持多种数据结构,操作简单。高效计算。
数据存放在内存中,避免频繁读写磁盘的时间开销,具有快速处理数据的优势。
键值型的数据存储结构,将数据之间关系简单化,避免复杂计算带来的时间开销。数据可持久化到磁盘,并通过复制机制保证数据的稳定与安全。缺点对值进行查找的功能较弱。缺少约束,容易出错。数据之间关系简单,不能建立复杂的计算关系。7.1Redis简介发展历程Redis之父——SalvatoreSanfilippo。一名意大利程序员,大家更习惯称呼他Antirez创建访客信息网站,统计网站最近访客的信息。为每一个网站维护列表,并通过先进先出存储最近的信息。最初使用MySQL数据库存储网站访客增多导致对磁盘的频繁读写、性能降低限制数据库性能的瓶颈在于磁盘内存存储数据,实现一个具有列表结构的数据库多年的演进丰富了Redis的数据结构及机制7.1Redis简介应用场景数据库配合关系型数据库做高速缓存多样的数据结构存储持久化数据排行榜,TopN利用有序集合计数器利用自增方法INCR、DECR时效性数据,比如手机验证码利用有序集合7.2基本概念与设计原理键值数据库
键值型数据库是一种非关系数据库,它使用简单的键值方法来存储数据。键值数据库将数据存储为键值对集合,其中键作为唯一标识符。键和值都可以是从简单对象到复杂复合对象的任何内容。(“database”,“Redis”)Key:数据的唯一入口value:数据实际存储的内容缓存缓存是⼀个高速数据交换的存储器,使用它可以快速的访问和操作数据主要存放读写比很高、很少变化的数据。7.2基本概念与设计原理数据结构结构类型结构存储的值结构的读写能力String可以是字符串、整数或者浮点数对整个字符串或者字符串其中的一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作List一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或弹出元素;根据偏移量对链表进行修剪(trim);读取单个或多个元素;根据值查找或移除元素Set包含字符串的无序收集器,并且包含的每个字符串都是独一无二、各不相同的。添加、移除、获取单个元素;检查一个元素是否存在集合中;计算交集、并集、差集;从集合中随机获取元素Hash包含键值对的无序散列表添加、移除、获取单个键值对;获取所有键值对Zset字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定添加、移除、获取单个元素;根据分值范围(range)或者成员来获取元素7.3Redis数据库的安装和配置方法参考教材官网:
https://redis.io/docs/install/Github:/tporadowski/redisRedis服务启动命令:redis-server/etc/redis/redis.confRedis服务连接命令:redis-cli-h–p6379-apassword7.4Redis数据库创建方法Redis数据库只是命名空间的一种形式:所有数据库仍然保留在同一个RDB/AOF文件中。在具体使用场景中,Redis数据库应该用于分离属于同一应用程序的不同密钥,而不是将单个Redis实例用于多个不相关的应用程序。与Redis数据库的新连接将会使用数据库0。可以通过“select”命令进入其他编号的数据库为防止数据分类不明显,通常采取以命名空间开头的方式存储数据,使不同类型的数据统一放到一个命名空间下。命名空间不需要预先定义,只需在存储数据时,将键值对中的键命名为“命名空间:Key”的形式。默认情况下,Redis有0-15个数据库索引选择数据库以命名空间开头的方式存储数据7.5Redis基本操作指令针对key的操作命令功能keys*查看当前库所有keyexistskey判断某个key是否存在typekey查看你的key是什么类型delkey删除指定的key数据expirekey1010秒钟:为给定的key设置过期时间ttlkey查看还有多少秒过期,-1表示永不过期,-2表示已过期select切换数据库dbsize查看当前数据库的key的数量flushdb清空当前库7.5Redis基本操作指令针对String的操作命令功能set<key><value>添加键值对get<key>查询对应键值append<key><value>将给定的<value>追加到原值的末尾strlen<key>获得值的长度setnx<key><value>只有在key不存在时设置key的值incr<key>将key中储存的数字值增1只能对数字值操作,如果为空,新增值为1decr<key>将key中储存的数字值减1只能对数字值操作,如果为空,新增值为-1incrby/decrby<key><步长>将key中储存的数字值增减。自定义步长。7.5Redis基本操作指令针对List的操作常用命令功能lpush/rpush从左边或右边压入一个或多个值lrangekeystartstop查看指定区间的元素,[0,-1]表示全部元素lpop/Rpop从左边或右边弹出一个值lindex按照索引下标获取元素(从左到右)llen获取列表长度linsertkeybefore/aftervaluenewvalue在指定value的前/后插入newvaluelremkeynvalue从左边删除n个valuelsetkeyindexvalue把指定索引位置的元素替换为另一个值7.5Redis基本操作指令针对Set的操作常用命令功能sadd将一个或多个元素加入到集合当中smembers取出集合的所有值sismember判断集合是否存在某值。存在返回1,不存在返回0scard返回集合中元素的个数srem从集合中删除元素sinterkey1key2…keyN返回所有给定key的交集sunionkey1key2…keyN返回所有给定key的并集集sdiffkey1key2…keyN返回所有给定key的差集7.5Redis基本操作指令针对Hash的操作常用命令功能hmsetkeyfieldvalue[fieldvalue…]为指定key批量设置field-valuehsetnxkeyfieldvalue当指定key的field不存在时,设置其valuehgetallkey获取指定key的所有信息(field和value)hkeyskey获取指定key的所有fieldhvalskey获取指定key的所有valuehlenkey指定key的field个数hgetkeyfieldHGETkeyfieldhmgetkeyfield[field…]为指定key获取多个filed的值hexistskeyfield指定key是否有fieldhincrbykeyfieldincrement为指定key的field加上增量increment(只对数字有效)7.5Redis基本操作指令针对Zset的操作常用命令功能zaddkey[scoremember…]添加元素zscorekeymember返回指定值的分数zrangekeystartstop[withscores]返回指定区间的值,可选择是否一起返回scoreszrangebyscorekeyminmax[withscores]在分数的指定区间内返回数据,从小到大排列zrevrangebyscorekeymaxmin[withscores]在分数的指定区间内返回数据,从大到小排列zcardkey返回集合中所有的元素的数量zcountkeyminmax统计分数区间内的元素个数zremkeymember删除该集合下,指定值的元素zrankkeymember返回该值在集合中的排名,从0开始zincrbykeyincrementmember为元素的score加上增量7.5Redis基本操作指令Redis事务1000If1000>700then-700If1000>400then-400If1000>300then-3001000300-100-400700400300定义:
Redis事务是一个单独的隔离操作。事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。为什么需要事务?7.5Redis基本操作指令Redis事务相关命令:MultiExec标记事务的开始执行命令getXXSetXX…getXX组队阶段getXXSetXX…getXX执行阶段Discard取消事务,放弃组队7.5Redis基本操作指令Redis事务事务的错误处理:MultiExec标记事务的开始执行命令getXXSetXX…getXX组队阶段getXXSetXX…getXX执行阶段Discard取消事务,放弃组队errorRedis的事务可以理解为一个打包的批量执行脚本,它的执行并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。7.5Redis基本操作指令事务的错误处理——组队阶段出现错误事务的错误处理——执行阶段出现错误7.6Redis的基于图形化管理工具的数据库查询方法RedisInsight:
/redis-enterprise/redis-insight/7.7Redis的基于Python的数据库连接与查询Python连接Redis数据库安装redis模块:pip3installredis导入redis模块:importredis连接数据库redis模块提供两个类Redis和StrictRedis来实现数据库的命令操作。StrictRedis实现了绝大部分官方的命令,参数也一一对应,比如set()方法就对应Redis命令的set方法。而Redis类是StrictRedis的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将部分方法做了改写,通过连接池方式建立连接7.8Redis的维护数据的导入导出Redis-dump工具(见教材):将Redis中的数据导出为json文件。持久化:将内存中的数据存储到磁盘的方式。Redis提供了两种持久化的机制,分别是RDB(RedisDataBase)和AOF(AppendOnlyFile)持久化方法优点缺点RDB快照文件十分紧凑。该方式下数据库只包含一个文件,适合用于备份,进而可用作灾难恢复。最大化Redis性能,子进程负责创建快照,不影响父进程。恢复大数据集时比AOF块。系统故障时会丢失上一次创建快照后写入的所有数据AOF
更高的数据安全性AOF文件易于分析、导出和人工处理AOF文件体积大AOF速度较慢持久化7.8Redis的维护持久化RDB(RedisDataBase)RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,这也是默认的持久化方式。这种方式将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以利用RDB持久化生成的dump.rdb文件进行数据的迁移。只需用原Redis服务器的dump.rdb文件替换掉目标Redis服务器的dump.rdb文件,之后重启目标Redis服务器即可。RDB默认配置选项
“save6010000”表示自上一次创建快照之后,60秒之内如果有10000次写入时,启动RDB。当有多个save选项时,满足一个即开始执行。7.8Redis的维护持久化AOF(AppendOnlyFile)AOF持久化以独立日志的方式记录每次写命令,重启时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DBJ50-T-571-2026 盾构注浆材料应用技术标准
- 保险投资理财知识专项训练题库
- 康复器械基础知识考试题库及答案
- 注册国际投资分析师(CIIA)考试(试卷一)能力提高训练试题库(广东省云浮市2026年)
- 昭通市一级造价工程师考试(建设工程造价案例分析、交通运输工程)题库及答案(2026年)
- 2026年装饰装修质量员练习题带答案
- 2025年浙江省嵊州市高二生物下册期末考试模拟卷【综合卷】附答案
- 2026年长江十年禁渔政策考试题及答案
- 铁路大型养路机械维修专业面试题库及答案
- 2026年银行客服咨询试题题库及答案
- 2026年部编版新教材道德与法治八年级上册全套单元、期中、期末检测题及答案(共6套)
- GB 20815-2026视频安防监控数字录像设备
- 食品检验检测机构授权签字人考核通关指南
- 2026年养老管理师考试试题及答案详解
- 2026年上海市浦东新区高三二模英语试题(含答案)
- 产程中产妇情绪管理及心理护理要点
- 杂交水稻技术与管理
- 医药代表转正述职报告
- T/CCMA 0147-2023异型吊篮安装、使用和拆卸安全技术规程
- 食品经销授权合同范本
- 兽医外科行业发展趋势及前景展望分析报告
评论
0/150
提交评论