版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章文本数据可视化本章重点◎了解文本可视化的相关概念及文本数据的分类◎理解文本数据可视化的分类◎理解词云图概念和意义◎掌握基于Python的词云生成方法目录CONTENTS文本数据可视化概述5.1文本数据可视类型5.2Python编程绘制词云5.3文本数据可视概述5.1文本数据可视化综合了多种学科,帮助人们理解复杂文本内容、结构、和内在规律,提取出最能代表文本的信息,并进行可视化。5.1.1文本数据可视化简介1.海量文本数据人类社会不断积累文本信息,在互联网时代,每天都有海量的“用户生成内容”,且文本数据来源非常广泛,包括长文本(文章、书籍、网页和博客等)和短文本(微博状态、微信消息、网页评论和手机短信等)。2.面临的难题(1)人们接收信息的速度已经小于信息产生的速度,尤其是文本信息;(2)海量信息使人们处理和理解的难度日益增大;(3)传统的文本分析技术所提取的信息,难以满足人们通过浏览、筛选等方式进行整合的需求;(4)理的分析理解和应用。3.文本可视化的重要作用(1)通过视觉符号的形式表达文本内容,便于人们快速理解文本信息;(2)将无结构的文本信息自动转换为可视的有结构信息;(3)使人类视觉认知、关联、推理的能力得到充分的发挥;(4)结合机器智能和人工智能,为人们更好的理解文本和发现知识听过了新的有效途径。4.文本可视化应用(1)商业智能与决策支持。通过词云、情感分析图等形式,可直观呈现用户评论、市场报告中的关键词频次和情感倾向;(2)社交媒体分析。文本可视化可解析社交媒体数据中的话题传播路径和情感分布;(3)金融舆情监控。在金融领域,文本可视化用于实时展示新闻情感指数和风险关键词分布。5.1.2文本数据提取1.文本分析内容文本可视化依赖于自然语言处理,因此词袋模型、命名实体识别、关键词抽取、主题分析、情感分析等是较常用的文本分析技术。过程主要包括:(1)文本数据预处理,过滤无效信息。(2)特征提取,提取出文本词汇及其内容。(3)采用灵活的度量方法提取文本特征,分析分本间相似性、文本聚类等。(4)表示这些过程处理过的数据。2.文本可视化基本流程文本可视化的基本流程为:原始文本→文本信息挖掘(文本预处理、文本特征的抽取和度量)→视图绘制(图元设计、图元布局)→人机交互,文本可视化流程如图5-1所示。3.可视化呈现及用户感知(1)信息图的视觉编码策略。信息图通过视觉元素将文本信息结构化,提升信息传递效率,主要分为两类编码方式:一是文本内容的视觉编码,包括尺寸、颜色、形状、方位、纹理等;二是文本间关系的视觉编码,包括网络图、维恩图、树状图、坐标轴等。(2)交互设计增强用户感知。交互通过动态操作降低认知负荷,并支持探索性分析,包括高亮、缩放、动态转换、关联更新等。文本数据可视化类型5.2文本数据大致可分为3种:单文本、文档集合和时序文本数据。对应的文本可视化也可分为3类:文本内容可视化、文本关系可视化和文本多特征信息可视化。5.2.1.文本内容可视化一段文本的内容可以用高频词、短语、句子、主题等代表,但是文本可视化遇到的任务通常是对有海量文本的集合进行可视化分析,针对不同类型的文本集合,我们有不同的方法来进行可视化分析。1.基于关键词的文本内容可视化一个词语若在目标文本中出现频率较高,那么这个词语可能就是这个文本的关键词。常采用TF-IDF(TermFrequency-InverseDocumentFrequency)方法来计算词语对表达文本信息的重要程度。其中TF(TermFrequency)指词语在目标文本的出现频率,IDF(InverseDocumentFrequency)是逆文件频率,计算公式分别如下所示:5.2.1.文本内容可视化(1)文档散(DocuBurst)文档散使用词汇库中的结构关系来布局关键词,同时使用词语关系网中具有上下语义关系的词语来布局关键词,从而揭示文本中的内容。首先,将一个单词作为中心点,中心点的词汇可以由用户指定,选择不同的中心点词汇呈现出的可视化结果将大不相同;然后,将整个文章内的词语呈现在一个放射式层次圆环中,外层的词内层词的下义词。这样就可以直观的展示文档的中心词在词语关系网中是如何被呈现的。如图5-2所示。5.2.1.文本内容可视化(2)标签云(TagCloud)标签云(TagCloud)是一种最常见的,简单的关键词可视化方法,首先,统计文本中词语的出现频率,提取出现频率较高的关键词;然后,按照一定的顺序和规律将这些关键词展示出来。如图5-3所示。5.2.1.文本内容可视化(3)文档卡片(DocumentCards)文档卡片(DocumentCards)则是结合了文档中的关键词和关键图片进行可视化,布局在一张小卡片中。其中的关键图片是指采用智能算法抽取并根据颜色分类后的代表性图片。如图5-4所示。5.2.1.文本内容可视化2.时序文本可视化时序文本具有时间性和顺序性,比如,新闻会随着时间变化,小说的故事情节会随着时间变化,网络上对某一新闻事件的评论会随着真相的逐步揭露而变化。对具有明显时序信息的文本进行可视化时,需要在结果中体现这种变化。(1)动态标签云(SparkClouds)动态标签云(SparkClouds)是在传统标签云的基础上引入了时间维度,在每个关键词下方嵌入微型折线图(Sparklines),清晰展示词频随时间波动的动态过程,解决了传统标签云无法直接表现时序变化的缺陷,如图5-5所示。5.2.1.文本内容可视化(2)主题河流(ThemeRiver)主题河流(ThemeRiver)是由SusanHavre等学者于2000年提出的一种时序数据可视化方法,主要用于反映文本主题强弱变化的过程。但是只能在每个时间刻度上各主题简单概括成一个数值,不能描绘主题的特性。经典的主题河流模型包括两个属性:颜色:表示主题的类型,一个主题用一个单一颜色的涌流表示;宽度:表示主题的数量(或强度),涌流的状态随着主题的变化,可能扩展、收缩或者保持不变。在图5-6中,横轴表示时间,河流中的不同颜色的涌流表示不同的主题,涌流的流动表示主题的变化。在任意时间点上,涌流的垂直宽度表示主题的强弱。5.2.1.文本内容可视化3)文本流(TextFlow)文本流(TextFlow)也算是ThemeRiver的一种拓展,它不仅表达了主题的变化,还能表达了各个主题随着时间的分裂与合并。如某个主题在某个时间分成了两个主题,或多个主题在某个时间合并成了一个主题。文本流是不仅可以表达主题的变化,还能随着时间的推移展示各个主题之间分裂与合并的状态。如图5-7所示。5.2.2文本关系可视化文本关系包括文本内、文本间的关系以及文本集合之间的关系。文本关系可视化的目的就是呈现这些关系。文本内的关系:是指词语的前后关系;文本间的关系:是指网页之间的超链接关系、文本之间内容的相似性和文本之间的引用等;文本集合之间的关系:是指文本集合内容的层次性等关系。1.词语树词语树(WordTree)是使用树形图展示词语在文本中的出现情況,可以直观地呈现出一个词语和其前后的词语。用户可自定义感兴趣的词语作为中心节点。中心节点向前扩展,就是文本中处于该词语前面的词语;中心节点向后扩展,就是文本中处于该词语后面的词语。字号大小代表了词语在文本中出现的频率。如图5-8所示,图中采用了词语树的方法来呈现一个文本中某个单词与其相连的前后所有的词语。5.2.2文本关系可视化2.短语网络短语网络(PhraseNetwork)用节点链接图来展示无结构文本中语义单元彼此间的关系。短语网络包括两种属性:节点(个词语或短语)和带箭头的连线(节点与节点与节点之间的关系,这个关系需要用户定义)。如图5-9所示,“close”在“door”前面,则箭头就由“close”指向“door”;而且“close”和“door”之间连线的宽度很宽,就说明“closedoor”这个短语在文中出现的频率很高。5.2.3文本多特征信息可视化多层面或多维度是指从多个角度或提取多种特征对文本集合分析。1.脸谱地图集脸谱地图集(FaceAtlas)结合了气泡集和节点-链接图两种视图,用于表达文本各层面信息内部和外部的关联。每个节点表示一个实体,用kde
方法刻画出气泡图的轮廓,然后用线将同一层面的实体链接起来,一种颜色代表一种实体。图5-10是基于医疗健康文档,展示了病名、病因、症状、诊断方案等多层面的信息,两团分别代表糖尿病1号和2号,连线是指它们之间的并发症。2.平行标签云平行标签云(ParallelTagClouds)结合了平行坐标(该视图在多维数据可视化中经常使用)和标签云视图。每一列是一个层面的标签云,然后连接的折线展现了选中标签在多个层面的分布。平行标签云如图5-11所示。Python编程绘制词云图5.3词云是文字组件的一种,支持自定义文本的内容、颜色、绘制形状等,支持多系列颜色配置,支持根据权重值映射文本大小,能够以词云的形式在可视化应用中展示较多数量的文本。词云就是对网络文本中出现频率较高的关键词予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。本节重点讲述python编程生成词云图的方法。1.安装工具包进入Anaconda安装目录下的Scripts,再地址栏输入“cmd”进入命令窗口,输入如下两条命令,分别安装“jieba”库和“wordcloud”库。pipinstalljiebapipinstallwordcloud2.调停词-stopwords在实际制作词云中,有很多词是没有展示出的意义的,例如我,他等主语,那如何不显示这些词了,这就涉及到停用词。(1)英文停用词wordcloud自带一个英文停用词表,是一个集合的数据类型。只需导入jieba的停用词库。(2)中文停用词用wordcloud库制作中文词云图,必须要分词,所以总结下来,中文中需要设置停用词的话可以有三种方法:在分词前,将中文文本的停用词先过滤掉;分词的时候,过滤掉停用词;在wordcloud中设置stopwords。通常使用再wordcloud中设置stopwords,我们需要先有一个中文停用词表,在线下载即可,然后将停用词表清洗为集合数据格式。3.生成词云(1)生成英文词云图程序代码。在JupyterNote中输入如下代码。运行结果。结合前面章节的matplotlib.pyplot工具,使用Python生成中文词云图的绘制结果如图5-12所示。3.生成词云2)生成中文词云图由于wordcloud本身不支持中文字体,所以要生成中文词云时,可以使用两种方法:第一种方法,直接引用本机字体库中的中文字体所在的绝对路径“C:\Windows\Fonts”;第二种方法,需要将需要使用的字体库文件拷贝至本项目目录下,通常创建一个fonts目录,将字体库文件拷贝至该目录,字体库文件扩展名为“ttc”。此处使用第二种方法。程序代码如下:运行结果。使用Python生成中文词云图的代码如图5-13所示。感谢观看第6章Neo4j图数据库本章重点◎了解图数据库的相关概念◎了解图数据库的分类和图数据与关系数据库的不同应用领域◎掌握Neo4j安装和配置◎掌握Cypher查询语言的使用◎掌握Cypher函数的使用目录CONTENTS图数据库概述6.1Neo4j安装和配置6.2Cypher查询语言6.3Cypher函数6.4图数据库概述6.1随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系,随数据量的增长而呈几何级数增长,亟需一种能够处理海量复杂数据关系运算的数据库,图数据库应运而生。世界上很多著名的公司都在使用图数据库。比如:社交领域(Facebook和Twitter等),零售领域(eBay和沃尔玛等),金融领域(摩根大通、花旗和瑞银等)、汽车制造领域(沃尔沃、戴姆勒和丰田等),电信领域(Verizon、Orange和AT&T等),酒店领域(万豪和雅高酒店等)。1.分类由于存储和处理模型的不同,图数据库也有一些区分。比如:Neo4j属于原生图数据库,它使用的后端存储是专门为Neo4j这种图数据库定制和优化的,能更有利于发挥图数据库的性能;而JanusGraph不是原生图数据库,而是将数据存储在其他系统如HBase。1)图存储一些图数据库使用原生图存储,这类存储是经过优化的,是专门为了存储和管理图而设计的。并不是所有图数据库都使用原生图存储,也有一些图数据库将图数据序列化,然后保存到关系型数据库或者面向对象数据库,或其他通用数据存储中。2)图处理引擎原生图处理(也称为无索引邻接)是处理图数据的最有效方法,因为连接的节点在数据库中物理地指向彼此。2.对比1)与关系型数据库对比关系型数据库实际上并不擅长处理关系。很多场景下的业务需求完全超出了当前的关系型数据库架构,当我们要查询涉及多张表的数据时,需要开发人员JOIN(连接)几张表,效率非常低下。在数据关系中,图形数据库在查询速度方面非常高效,即使对于深度和复杂的查询也是如此。(2)与其他NoSQL数据库对比NoSQL数据库大致可以分为四类,分别为:键值(key/value)数据库、列存储数据库、文档型数据库和图数据库。各类NoSQL数据库的说明如表6-1所示。在上述NoSQL中,图数据库从最近十年的表现来看已经成为关注度最高、也是发展趋势最迅猛的数据库类型。图6-1就是db-对最近六年来所有数据库种类发展变化趋势的分析结果。与关系数据库或其他NoSQL数据库相比,图数据库的数据模型也更加简单,更具表现力。图数据库是为与事务(OLTP)系统一起使用而构建的,并且在设计时考虑了事务完整性和操作可用性。在目前技术社区和商用市场上最被广大业务和技术人员熟知,而且应用最广泛的当属Neo4j,如图6-2所示。Neo4j安装和配置6.26.2.1安装Neo4j1.下载JavaNeo4j是基于Java运行环境的图形数据库,对操作系统的要求为Windows10/11、macOS10.15+及Linux;需要Java环境支持。从Oracle官方网站下载Java。从Neo4j5.26开始需要JDK17或更高版本,本机安装的是JDK21。如图6-3所示,单击JDKDownload页面后,在弹出的页面,单击jdk-21_windows-x64_bin.exe下载至本地。2.安装JavaJDK双击下载后的jre-8u301-windows-x64.exe文件,在弹出的窗口中,选中“更改目标文件”后单击“安装”后,单击“更改”按钮,可更改安装路径,也可以使用默认路径,如图6-4所示。6.2.1安装Neo4j3.配置Java环境变量配置Java的环境变量的步骤如下。1)新建JAVA_HOME变量,在桌面“此电脑”图标上,单击右键选择“属性”,在“设置”对话框单击“高级系统设置”,在打开的“系统属性”对话框的“高级”选项下,单击“环境变量”按钮,在打开的“编辑环境变量”对话框,新建一个用户变量,如图6-5所示,变量名为“JAVA_HOME”,变量值为“C:\ProgramFiles\Java\jdk-21”。2)编辑系统Path变量,选中系统变量Path,进入“编辑环境变量”对话框,分别在最下方的两个文本框中输入“%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin”,如图6-6所示。3)检查配置是否成功,运行cmd,输入java--version,如果显示Java的版本信息,说明Java的安装和配置成功了,检查Java配置如图6-7所示。6.2.1安装Neo4j4.下载Neo4j安装文件从Neo4j官网下载最新版本Neo4j5.26.9社区(Community)版本neo4j-community-5.26.9-windows.zip,解压到主目录,需要注册(信息随意填写)后才能下载,如图6-8所示(本机安装的是neo4j-community-5.26.0-windows.zip版本),把下载的文件解压到本机的D:\bigdata\neo4j目录下。5.创建Neo4j的环境变量创建用户环境变量NEO4J_HOME,如图6-9(a)所示;并编辑系统环境变量Path,在最下方的文本框输入“%NEO4J_HOME%\bin”,如图6-9(b)所示。6.2.2配置Neo4j1.Neo4j配置文档配置文档存储在Neo4j安装目录的conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任何配置,就可以启动和运行服务器。配置文档存储在Neo4j安装目录的conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需要进行任何配置,就可以启动和运行服务器。Neo4j配置文档核心内容如下。1)核心数据文件的位置。核心数据文件存储的位置,默认是在data/graph.db目录中,要改变默认的存储目录,可以更新配置选项,如图6-10所示。2)安全验证,默认是启用的,如图6-11所示。3)配置Java堆内存的大小,如图6-12所示。6.2.2配置Neo4j2.neo4j网络协议neo4j支持三种网络协议,默认情况下,不需要配置就可以在本地直接运行。(1)Neo4j支持三种网络协议(Protocol)Neo4j支持三种网络协议(Protocol),分别是Bolt,HTTP和HTTPS,默认的连接器配置有三种,为了使用这三个端口,需要在Windows防火墙中创建InboundRules,允许通过端口7687,7474和7473访问本机,如图6-13所示。(2)连接器的可选属性listen_address:设置Neo4j监听的链接,由两部分组成:IP地址和端口号(Port)组成,格式是:<ip-address>:<port-number>(3)设置默认的监听地址设置默认的网络监听的IP地址,该默认地址用于设置三个网络协议(Bolt,HTTP和HTTPs)的监听地址,即设置网络协议的属性:listen_address地址。在默认情况下,Neo4j只允许本地主机(localhost)访问,要想通过网络远程访问Neo4j数据库,需要修改监听地址为,这样设置之后,就能允许远程主机的访问,如图6-14所示。(4)分别设置各个网络协议的监听地址和端口HTTP链接器默认的端口号是7474,Bolt链接器默认的端口号是7687,必须在Windows防火墙中允许远程主机访问这些端口号,如图6-15所示。6.2.3Neo4j集成浏览器1.通过控制台启动Neo4j程序以管理员权限启用DOS命令行窗口,输入以下命令,通过控制台启用Neo4j程序,进入Neo4j的安装目录下的bin目录,输入“neo4j.batconsole”命令,如果看到如图6-16所示的消息started,说明Neo4j已经开始运行。2.打开Neo4j集成浏览器Neo4j服务器具有一个集成的浏览器,在启动Neo4j服务之后,可以使用Neo4j集成的浏览器管理图数据库。在一个运行Neo4j服务器主机上,在浏览器的地址栏输入“http://localhost:7474”,显示如图6-17所示的登录界面。默认的host是http://localhost:7687,默认的用户是neo4j,默认的密码是:neo4j,第一次成功connect到Neo4j服务器之后,需要重置密码。访问GraphDatabase需要输入身份验证,host是Bolt协议标识的主机。3.使用Neo4j集成浏览器输入用户名和密码登录成功后,会显示如图6-18所示的Neo4j集成浏览器界面,用户可以在“neo4j$”后输入CLD语句,并单击右侧的向右的三角形按钮便可执行该CLD语句。6.2.4Neo4j基本概念Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络上而不是表中。它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。使用Neo4j创建的图(Graph)基于属性图模型,在该模型中,每个实体都有ID(Identity)唯一标识,每个节点由标签(Lable)分组,每个关系都有一个唯一的关系类型。1.标签(Label)在图形结构中,标签用于对节点进行分组,相当于节点的类型,拥有相同标签的节点属于同一个分组。一个节点可以拥有零个,一个或多个标签,因此,一个节点可以属于多个分组。对分组进行查询,能够缩小查询的节点范围,提高查询的性能。2.节点(Node)节点是指一个实实在在的对象,这个对象可以有好多的标签,表示对象的种类,也可以有好多的属性,描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。3.关系(Relationship)用来描述节点与节点之间的关系,这也是图数据与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。关系可以拥有属性。6.2.4Neo4j基本概念4.实体(Entity)实体是指节点(Node)和关系(Relationship);每个实体都有一个唯一的ID;通常情况下,节点除了ID属性之外,都会设置Name属性,用于以文本的方式来标识节点,Name属性的值通常是唯一的。1)每个实体都有零个,一个或多个属性,一个实体的属性键是唯一的;2)每个节点都有零个,一个或多个标签,属于一个或多个分组;3)每个关系仅有一个关系类型,关系用于连接两个节点;5.路径(Path)路径是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合。6.标记(Token)标记是非空的字符串,用于表示标签(Lable)、关系类型(RelationshipType)、或属性键(PropertyKey):1)标签(Label):用于对节点进行分组,多个节点可以有相同的标签,一个节点可以有多个标签,拥有相同标签的节点属于同一个分组;2)关系类型(RelationshipType):用于表示关系的类型,多个关系可以有相同的关系类型,但是一个关系仅有一个关系类型;3)属性键(PropertyKey):用于唯一标识一个属性,在一个关系或节点中,属性键是唯一的。7.属性(Property)描述节点的特性,采用的是Key-Value结构,可以随意设定来描述节点的特征;每个节点或关系可以有一个或多个属性;属性值可以是标量类型(Boolean、Integer、Float、String)、或组合类型(List,Map)。Cypher查询语言6.3Cypher查询语言(CQL)是Neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤;由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。6.3.1CQL简介CQL(CypherQueryLanguage,Cypher查询语言),类似于Oracle数据库具有SQL(StructureQueryLanguage,结构化查询语言)一样,Neo4j具有CQL作为查询语言。1.Neo4jCQL特点(1)CQL是Neo4j图形数据库的查询语言。(2)CQL是一种声明性模式匹配语言。(3)CQL遵循SQL语法。(4)CQL语法是非常简单且人性化、可读的格式。2.Neo4jCQL命令常用的Neo4jCQL命令和作用如表6-2所示。3.Neo4jCQL数据类型Neo4jCQL数据类型数据类型与Java语言类似。它们用于定义节点或关系的属性,数据类型及其描述如表6-3所示。6.3.2创建节点在Neo4jCQL里面通过用一对小括号“()”表示一个节点,下面分为以下三种形式创建节点。1.neo4jCQL创建没有属性的节点1)语法规则2)语法说明label-name是节点标签名称,相当于Mysql数据库中的表名;而node-name是节点名称,其实代指在当前表中创建的一行数据。3)示例下面的CQL创建了一个名为em的节点,该节点的标签为Employee,如图6-19所示。create(<node-name>:<label-name>)6.3.2创建节点2.Neo4jCQL创建具有属性的节点1)语法规则2)语法说明它创建一个具有一些属性(键值对:<key1>:<Value1>)的节点来存储数据,其实即使在当前表中创建有若干个字段名和字段值的一行数据。3)示例下面的Neo4jCQL创建了一个名为e的节点,该节点的标签为Employee,该节点的属性的键值对为:{name:"Sellina",age:34},如图6-20所示。create(<node-name>:<label-name>{<key1>:<Value1><keyn>:<Valuen>});6.3.2创建节点3.Neo4jCQL创建具有多个标签的节点1)语法规则2)语法说明它创建一个具有多个标签的节点,且每个标签之间用“:”分隔。3)示例下面的Neo4jCQL的CREATE子句创建了一个名为e的节点,该节点的有2个标签,分别为“:Employee:Leader”,且该节点有3个属性,分别为:r{name:"Hanks",age:45,telephone,如图6-21所示。create(<node-name>:<label-name1>:<label-name2>:<label-namen>);6.3.3查询节点Neo4jCQL的MATCH命令用于从数据库获取有关节点和属性的数据,MATCH子句用于指定搜索的模式(Pattern)、WHERE子句用来过滤MATCH查询的结果,return子句配合使用返回节点的相关信息。1.MATCH查询1)语法规则match(<node-name>:<label-name>);2)语法说明该语句匹配指定名称和指定标签的节点。2.RETURN返回1)语法规则return<node-name>.<property1-name>,<node-name>.<propertyn-name>;2)语法说明Neo4jCQLreturn子句用于检索节点的某些属性、检索节点的所有属性、检索节点和关联关系的某些属性、检索节点和关联关系的所有属性。6.3.3查询节点3.WHERE子句像SQL一样,Neo4jCQL的match命令中提供了where子句来过滤MATCH查询的结果。1)语法规则where<property-name><comparison-operator><value>2)语法说明<property-name>:表示属性名。<comparison-operator>:可以是Neo4jCQL比较运算符之一,Neo4j支持的比较运算符包括:=(等于)、<>(不等于)、<(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)。<value>:是一个字面值,如数字,字符串等。Neo4j支持在Neo4jCQL的WHERE子句使用多个条件,Neo4j支持的多个条件的布尔运算符包括:and(与)、or(或)、not(非)、xor(异或)。6.3.3查询节点【示例6-1】查询整个图形数据库。1)CQL语句match(n)returnn;2)运行结果在名为neo4j数据库中,有2个标签(2张表):Employee、Leader;Employee标签下有两个节点(两行数据)、Leader标签有一个节点(一行数据),如图6-22所示。6.3.3查询节点【示例6-2】查看节点属性。1)CQL语句match(e:Employee)return,e.age,e.telephone;2)运行结果查询Employee标签(Employee表)节点的,e.age,e.telephone三个属性的值,如图6-23所示。6.3.3查询节点【示例6-3】查询指定属性值的节点。1)CQL语句match(e)where="Tom"returne;2)运行结果查询name属性的值为“Tom”的节点,如图6-24所示。6.3.3查询节点【示例6-4】查询指定标签的节点。1)CQL语句match(e:Employee:Leader)returne;2)运行结果查询具有Employee和Leader这两个标签的节点,并返回节点,如图6-25所示。6.3.4创建关系Neo4j图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的。否则,Neo4j将抛出一个错误消息。基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系。创建关系时,应在方括号“[]”中指定关系,具体取决于关系在连字符“-”和箭头“->或<-”之间的关系方向。1.使用新节点创建关系1)语法规则create(<node1-name>:<label-name>)-[r:DemoRelation]->(<node2-name>:<label-name>)2)语法说明创建节点node1和node2,并创建节点node1到node2的关系r。6.3.4创建关系【示例6-5】创建新节点和节点间关系。1)示例代码如下:create(e:Employee{name:'Tom',age:28})-[r:work_in]->(c:Company{name:'HUAWEI’})returne,r,c;2)示例运行结果如图6-26所示,创建了一个具有Employee标签、name和age属性的节点e;创建了一个具有Company标签、name属性的节点c,并创建了节点e到节点c的work_in关系r,即员工e在公司c工作的关系,并返回两个节点和关系。6.3.4创建关系2.使用已知节点创建带属性的关系1)语法规则match(<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)create(<node1-label-name>)-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]->(<node2-label-name>)return<relationship-label-name>2)语法说明使用MATCH子句匹配查询节点node1和节点node2。【示例6-6】使用已有节点创建带属性的关系。创建(e:Employee:Leader{name:"Hanks"})节点到(c:Company)节点的lead关系,该关系有两个属性{position:'project
manager',duty:"budget"},代码如下:match(e:Employee:Leader{name:"Hanks"}),(c:Company)create(e)-[r:lead{position:'projectmanager',duty:"budget"}]->(c)returnr;上面的代码,使用MATCH子句查询具有Employee、Leader标签和name属性为Hanks的节点e,查询具有Company标签的节点c;使用CREATE子句创建e到c的关系r,且关系的属性名和属性值的键值对为{position:'project
manager',duty:"budget"},即身为员工和领导的节点e,在公司c节点的职责和岗位。与之同理,创建了公司节点c到员工节点e的雇用关系r,且关系的属性名和属性值的键值对为{years:3,insure:True},公司雇用员工的年限和保险情况同理,创建公司节点c到员工节点e的雇用hire关系,代码如下:match(c:Company),(e:Employee{name:"Sellina"})create(e)<-[r:hire{years:3,insure:True}]-(c)returne,c,r;6.3.5查询关系在Neo4jCQL中,查询关系分为三种符号:(1)“--”表示有关系,忽略关系的类型和方向;(2)“-->”或“<--”表示查询有方向的关系。1.查询数据库中所有的节点和关系【示例6-7】查询当前数据库的所有节点和关系。1)示例代码match(n)returnn;2)示例6-7运行结果如图6-28所示:上面的代码match(n)表示匹配数据库所有节点和关系,即查询整个图形数据的结构。6.3.5查询关系2.查询跟指定节点有关系的节点。【示例6-8】查询与具有Company标签节点有关系的所有节点。下面的代码查询具有Company标签的节点有关系的所有节点,注意在两个节点使用两个连续的减号“--”作为连接符,返回与具有Company标签的节点有关系的所有节点。1)示例代码如下:match(n)--(c:Company)returnn;2)示例运行结果如图6-29所示:6.3.5查询关系3.查询有向关系的节点【示例6-9】查询以具有Company标签节点为终止点的所有节点。1)下面的代码查询以具有Company标签节点为终止节点的关系的所有节点,注意在两个节点使用“<--”,即一个小于号和两个连续的减号合在一起作为连接符,可以实现以(c:Company)节点为终止点,所有满足条件的节点。示例代码如下:match(c:Company)<--(e)returne;2)示例运行结果如图6-30所示:6.3.5查询关系4.查询关系和关系类型【示例6-10】查询关系及其类型。下面的代码查询使用match子句查询具有Employee标签和name属性值为“Tom”的节点e到具有Company标签的节点c的关系r以及关系r的类型:match(e:Employee{name:'Tom'})-[r]->(c:Company)returnr,type(r);2)示例6-10运行结果如图6-31所示:6.3.5查询关系5.查询特定的关系类型1)通过"[Variable:Relationship{Key:Value}]"语法规则,指定关系r的类型和属性,代码如下:match(e:Employee{name:'Hanks'})-[r:lead{duty:"budget"}]->(c:Company)returnr,type(r);2)查询特定关系和关系类型运行结果如图6-32所示,从图中可以看出关系r的id为4,关系r起始节点id为2,终止节点id为1,关系的类型为“lead”,该关系的属性键值对为{duty:"budget"}。6.3.6DELETE删除Neo4j使用CQL的DELETE子句,可以只删除节点或删除节点及相关节点和关系。1.DELETE删除节点1)语法规则delete<node-name-list>【示例6-11】删除节点。下面的语句使用match(e:Employee)查询子句查询具有Employee标签的节点,DELETEe子句删除满足查询条件的节点,但是出现“Cannotdeletenode<2>,becauseitstillhasrelationships.Todeletethisnode,youmustfirstdeleteitsrelationships.”,表示被删除的两个节点还有关联的关系,必须先删除与其关联的关系才能删除节点,代码和运行结果如图6-33所示。6.3.6DELETE删除2.DELETE删除节点和关系1)语法规则delete<node1-name>,<node2-name>,<relationship-name>2)语法说明删除指定名称的节点和关系。【示例6-12】删除指定节点和关系。在示例中,使用match子句匹配(e:Employee{name:"Tom"})节点e,以及节点e到节点(c:Company)的关系[r],使用DELETEe,r子句删除节点e和关系r,示例的代码如下:match(e:Employee{name:"Tom"})-[r]->(c:Company)deletee,r;示例的运行结果如图6-34所示,通过运行结果的提示“Deleted1node,deleted1relationship”,表示一个节点和一个关系被删除。6.3.6DELETE删除3.清空整个数据库1)语法规则match(n)detachdeleten;2)语法说明删除数据库中所有的节点和关系,即清空数据库。6.3.7REMOVE和SET更新有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。可以使用Neo4jCQL的set子句向现有节点或关系添加新属性;使用Neo4jCQL的remove子句来删除节点或关系的现有属性和标签。Neo4jCQL的delete和remove命令之间的区别为:DELETE操作用于删除节点和关联关系;而remove操作用于删除标签和属性。Neo4jCQL的delete和remove命令之间的相似之处为:这两个命令不应单独使用,即两个命令都应该与match命令一起使用。1.REMOVE子句1)删除节点属性语法格式:match(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..})remove<node1-name>.<property1-name>,…<node2-name>.<property2-name>语法说明:node-name:是节点的名称。property-name:是节点的属性名称。<node1-name>.<property1-name>:节点名和节点属性之间使用“.”。6.3.7REMOVE和SET更新【示例6-13】删除指定节点的属性。在示例中,使用MATCH子句匹配(e:Employee{name:"Hanks"})节点e,使用removee.telephone子句删除节点e的telephone属性,并返回该节点,示例的代码如下:match(e:Employee{name:"Hanks"})removee.telephonereturne;示例的运行结果如图6-35所示,通过运行可以看到该节点的"properties"的中"telephone"属性被删除。6.3.7REMOVE和SET更新2)删除节点标签语法格式:MATCH(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..}),REMOVE<node-name>:<label2-name>,<noden-name>:<labeln-name>语法说明:node-name是节点的名称。property-name是节点的属性名称。<node1-name>.<label1-name>节点名和节点标签之间使用“:”。6.3.7REMOVE和SET更新【示例6-14】删除指定节点的标签。假如我们创建了一个有三个标签的节点,代码如下:create(e:Employee:Leader:Corporation{name:"Peter",age:48,telephone)returne;如图6-36所示,该节点有3个标签(Employee、Leader和Corporation)和三个属性(name、age和telephone)。示例中,使用match(e{name:"Peter"})子句匹配节点e,使用removee:Corporation子句删除节点的“Corporation”标签(法人标签),示例代码如下:match(e{name:"Peter"})removee:Corporationreturne;示例的运行结果如图6-37所示,通过运行结果提示“Removed1label”可见,节点e的1个标签“Corporation”被删除。6.3.7REMOVE和SET更新2.SET子句1)更新和添加节点属性语法格式:MATCH(node1-name:Label1,..{key1:value1,..}),…(noden-name:Label1,..{key1:value1,..}),SET<node1-name>.<property1-name>=value1,...<noden-name>.<propertyn-name>=valuen语法说明:node-name是节点的名称。property-name是节点的属性名称。<node1-name>.<property1-name>=value1:给节点node1-name的property1-name赋值为value1。6.3.7REMOVE和SET更新【示例6-15】给指定节点修改和添加属性。使用match(e:Employee{name:"Peter"})子句匹配节点e,使用set子句分别更新该节点telephone属性和添加.address属性,示例代码如下:match(e:Employee{name:"Peter"})sete.telephone=150123456789,e.address="Beijing"returne;示例6-15运行结果如图6-38所示,通过运行结果提示“Set2properties”,可以看到节点的两个属性被更新。6.3.7REMOVE和SET更新语法说明:
node-name是节点的名称。
property-name是节点的属性名称。
r为关系名称。
r.<property1-name>=value1:给关系r的property1-name赋值为value1。【示例6-16】修改和添加指定关系的属性。使用match(e:Employee{name:"Sellina"})子句匹配节点e,使用set子句分别更新该节点year属性和type属性,示例代码如下:match(node1-name:Label…{key:value..})-[r:Label{key:value}]->(node2-name:Label…{key:value..})setr.<property1-name>=value1,...r.<propertyn-name>=valuen2)更新和添加关系的属性语法格式:match(e:Employee{name:"Sellina"})<-[r]-(c:Company)setr.years=5,r.type="regularemployee"returnr;示例6-16运行结果如图6-39所示,通过运行结果提示“Set2properties”,可以看出关系r的两个属性被修改了。6.3.8ORDERBY排序Neo4jCQL在MATCH命令中提供了orderby子句,对match查询返回的结果进行排序。我们可以按升序或降序对行进行排序。默认情况下,按升序对行进行排序,如果我们要按降序对它们进行排序,需要使用DESC子句。1.ORDERBY子句语法格式如下:orderby<property-name-list>[desc]语法说明:
property-name-list:节点的属性列表。【示例6-17】按照节点的属性排序。使用match(e:Employee)子句匹配所有具有Employee标签的节点,使用return,e.age,e.telephone返回这些节点的3个属性,使用orderbye.agedesc子句,根据节点的age属性按照降序排序,示例代码如下:match(e:Employee)return,e.age,e.telephoneorderbye.agedesc;示例6-17的运行结果如图6-40所示:6.3.9UNION合并与SQL一样,Neo4jCQL也有两个子句:UNION和UNIONALL,可以将两个不同的结果合并成一组结果。1.UNION子句UNION子句将两组结果中的公共行组合并返回到一组结果中,它不从两个节点返回重复的行。该子句有一点限制,即结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型也应该相同。1)语法格式<matchCommand1>union<matchCommand2>2)语法说明:union可合并涉及不同节点类型或关系的查询2.AS子句不同节点使用不同的变量名,就会有不同的节点属性名称的前缀。这时union命令显示此错误消息。为了避免这种错误,Neo4j的CQL提供“as”子句,可以为不同前缀或不同属性名起别名。6.3.9UNION合并【示例6-18】联合查询结果。已知创建了一个新节点,示例代码如下:create(t:Teacher{name:"Mike",age:27,telephone)returnt;1)示例错误的运行结果如图6-41所示,根据错误提示“AllsubqueriesinanUNIONmusthavethesamecolumnnames”可知,错误的原因是两个查询子句使用了不同的列名(不同的前缀名)。2)要得到正确的运行结果,可以使用如下两种方法:(1)两个match查询使用相同的变量名,示例的代码和运行结果如图6-42所示。(2)在return子句中给不同前缀的属性名,使用as子句给属性名起相同的别名,如图6-43所示。6.3.10LIMIT和SKIPNeo4jCQL提供limit子句和skip来过滤或限制查询返回的行数,使用limit子句返回前几行,使用skip返回后几行。1.LIMIT子句1)语法格式:limitn2)语法说明:
n:n为整数。
LIMITn:只返回Topn个结果。1.SKIP子句1)语法格式:skipn2)语法说明:
n:n为整数。
skipn:只返回buttomn个结果。6.3.10LIMIT和SKIP图6-44查询指定数量的节点【示例6-19】查询所有节点、前两个节点和后两个节点。示例的代码和运行结果如图6-44所示,其中第1个运行结果查询所有具有Employee标签的节点;第2个运行结果查询所有具有Employee标签的后2个节点;第3个运行结果查询所有具有Employee标签的前2个节点。图6-44查询指定数量的节点6.3.11MERGE子句Neo4jCQL的merge子句是create子句和match子句的组合,可以实现创建节点、关系和属性。Neo4jCQL的merge子句在图中搜索给定模式,如果存在,则返回结果;如果它不存在于图数据库中,则它创建新的节点和关系并返回结果。1)语法格式:merge(<node-name>:<label-name>{<key>:<1-Value><n-key>:<n-Value>})2)语法说明:Neo4jCQL的MERGE子句语法与CQL的create子句类似。node-name:节点名。label-name:节点的标签名。<key>:<1-Value>:节点的属性名和属性值的键值对。6.3.11MERGE子句【示例6-20】使用MERGE子句创建节点。1)使用MERGE子句连续两次创建一个相同的节点,示例的代码如下:merge(e:Employee:Teacher{name:"Jennie",age:39,address:"Shanghai"});merge(e:Employee:Teacher{name:"Jennie",age:39,address:"Shanghai"});2)示例的运行结果如图6-45所示,通过运行结果可知,图的下半部分是第一行代码的运行结果,通过提示“Added2labels,created1node,set3properties”可知,已经成功的创建了一个有2个标签和3个属性的节点;图的上半部分是第二行代码的运行结果,通过提示“(nochanges,norecords)”可知,该节点已经存在,没有改变,没有新节点被创建。图6-45使用MERGE创建节点6.3.12NULL值Neo4jCQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有“NULL”属性值的新节点。【示例6-21】查询电话号码为NULL的节点信息。1)示例的代码如下:match(e:Employee)wheree.telephoneisNULLreturn,e.age,e.telephone;2)示例6-21的运行结果如图6-46所示:6.3.13IN操作符与SQL一样,Neo4jCQL提供了一个“in”运算符,以便为CQL命令提供值的集合。1)语法格式:in[<Collection-of-values>]2)语法说明:<Collection-of-values>:它是由逗号运算符分隔的值的集合。node-name:节点名。【示例6-22】查找name属性值为"Tom"、"Peter"或"Sellina"的所有节点。match(e:Employee)wherein["Tom","Peter","Sellina"]return,e.age,e.telephone;示例6-22使用in["Tom","Peter","Sellina"]筛选条件的运行结果如图6-47所示:6.3.14INDEX索引Neo4jCQL支持节点或关系属性上的索引,以提高应用程序的性能。我们可以为具有相同标签名称的所有节点的属性创建索引。可以在match或where或in运算符上使用这些索引列来改进CQL命令的执行。1.CREATEINDEX创建索引1)语法格式:createindexon:<label_name>(<property_name>)2)语法说明:冒号“:”:运算符用于引用节点或关系标签名称。上述语法描述它在节点或关系的的上创建一个新索引。2.DROPINDEX删除索引1)语法格式:dropindexon:<label_name>(<property_name>)2)语法说明:与创建索引语法一致。6.3.14INDEX索引【示例6-23】创建和删除指定标签和属性的索引。1)示例的代码如下:createindexon:Employee(age);dropindexon:Employee(age);2)示例6-23的运行结果如图6-48所示:图6-48创建和删除索引在Neo4j数据库中,CQL的create命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。根据我们对某些节点或关系的应用需求,我们必须避免这种重复。然后我们不能直接得到这个。我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。像SQL一样,Neo4j数据库也支持对Node或Relationship的属性的unique约束。unique约束优势体现了两点:可以避免重复记录和强制执行数据完整性规则。1.创建唯一约束语法1)语法格式:createconstrainton(<label_name>)assert<property_name>isunique2)语法说明:
createconstrainton:是一个Neo4jCQL关键字。
<label_name>:是节点或关系的标签名称。
assert:是一个Neo4jCQL关键字,表示声明。
<property_name>:它是节点或关系的属性名称。
isunique:是一个Neo4jCQL关键字,通知Neo4j数据库服务器创建一个唯一约束。上述语法描述了只需要节点或关系就可以创造一个独特的约束,如果创建约束时节点属性有重复值,Neo4jDB服务器将会抛出一个错误,表示无法创建。6.3.15UNIQUE约束2.删除UNIQUE约束1)语法格式:dropconstrainton(<label_name>)assert<property_name>isunique2)语法说明:删除指定标签<label_name>下和指定属性名<property_name>的唯一约束。【示例6-24】创建和验证唯一约束。1)创建唯一约束。给指定Employee标签(表)中和指定属性名(字段)创建唯一约束。2)创建了唯一约束后,再创建有重复name属性值的节点报错,代码和运行结果如图6-49所示。3)删除唯一约束,根据提示信息“Removed1constraint”可见,删除了一个约束,如图6-50下面的语句和运行结果。4)删除唯一约束后,再次插入name属性的重复值,不再报错,如图6-50所示上面的语句和运行结果。6.3.15UNIQUE约束我们使用Neo4j数据浏览器来执行和查看Neo4jCQL命令或查询的结果。Neo4j数据浏览器包含两种视图来显示查询结果:1)UI查看2)网格视图在本节中,将讨论如何在UI视图中更改节点或关系的字体。当在数据浏览器中执行Neo4jCQL的return子句时,它会在网格视图或UI视图中显示结果。默认情况下,Neo4j数据浏览器以小字体显示节点或关系图,并在UI视图中显示默认颜色。如果我们想要在更大的字体或不同的颜色中查看它们,那么如何增加它们的字体(大小)或如何改变它们的颜色。关于Neo4j提供的图形浏览器,可以从其中查看节点的属性,或者改变其中的节点的大小颜色。接下来用一个例子来讨论这个问题。6.3.16图形字体【示例6-25】在Neo4j数据浏览器中更改节点或关系的字体、颜色和尺寸。步骤1:打开Neo4j数据浏览器,即在浏览器地址栏输入http://localhost:7474/。步骤2:在Neo4j数据浏览器输入如下命令:6.3.16图形字体match(e:Employee)-[r:work_in]->(c:Company)returnr,e,c;步骤3:单击命令行右侧的执行按钮,Neo4j数据浏览器通过使用默认图形字体显示此查询结果,运行结果如图6-51所示。步骤4:在图6-52所示的界面中,单击“Employee”标签,可以看到图6-52(a)所示选项,用来修改Employee标签节点Tom的字体颜色(Color)和字体大小(Size);单击“work_in”关系,可以看到图6-52(b)所示的选项,用来修改该关系的线条颜色(Color)和线条粗细(Linewidth)。图6-52修改节点和关系的显示设置在Neo4j中,“Id”是节点和关系的默认内部属性。这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。它会自动递增。下面用一个具体示例展示一下。【示例6-26】查看节点ID属性。步骤1:新创建一个节点,输入如下命令:6.3.17ID属性create(c:Company{name:"Tencent",found:1998})returnc;步骤2:单击命令行右侧的执行按钮,运行结果如图6-53所示,然后单击新创建的节点,在运行结果的底部可以看到该节点若干属性“<id>:3found:1998name:Tencent”和所属的标签“Employee”。所谓的Caption标题,就是更改Neo4j浏览器的节点显示的文字(圆圈内部)。下面用一个具体例子展示一下。。【示例6-27】更改节点的标题。步骤1:查询示例6-26中创建的节点,输入如下命令:6.3.18Caption标题match(c:Company{name:"Tencent"})returnc;步骤2:单击命令行右侧的执行按钮,示例6-27运行结果如图6-54所示,然后单击Company标签,在运行结果的底部可以看到该节点可以更改的若干Caption,单击“id”,可以将该节点圆圈内的标题更改为该节点的id值3。Cypher函数6.4Cypher函数是对图进行查询和操作的重要工具。本节的所有函数都是在如下图6-55所示的图数据库的基础上的操作。断言函数是对给定的输入返回true或者false的布尔函数。它们主要用于查询的where部分过滤子图。1.Exists()函数如果指定的模式存在于图中,或者特定的属性存在于节点、关系或Map中,那么exists()函数返回True。语法如下:6.4.1断言函数exists(pattern-or-property)语法说明:pattern-or-property:模式或者属性(以“p”的形式)。【示例6-28】查询具有name属性和到其他节点的work_in节点。步骤1:输入如下命令:match(n)whereexists()returnASname,exists((n)-[:work_in]->())aswork;上面的命令解释如下。(1)使用match(n)匹配节点n;(2)使用whereexists()查询条件,判断节点n是否存在name属性;(3)使用return子句,分别返回节点n的name属性值且别名为name;(4)exists((n)-[:work_in]->())aswork表示判断节点n是否存在到其他节点的work_in关系,且将别名为work。步骤2:单击命令行右侧的执行按钮,运行结果如图6-56所示。2.all()函数判断一个断言是否适用于列表中的所有元素。语法如下:6.4.1断言函数all(variableinlistwherepredicate)语法说明:list:返回列表的表达式
variabl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 简阳市卫生健康局2026年简阳市医务社会工作服务岗位招募(10人)考试模拟试题及答案详解
- 队伍思想分析报告研判情况(3篇)
- 2026年深圳市盐田区中小学教师招聘笔试备考题库及答案详解
- 2026年安徽省铜陵市街道办人员招聘考试模拟试题及答案详解
- 2026年淮北市杜集区街道办人员招聘笔试参考试题及答案详解
- 2025年汕头市潮阳区街道办人员招聘笔试试题及答案详解
- 2025年漯河市源汇区中小学教师招聘考试试题及答案详解
- 2026年特殊作业培训试题附答案
- 2026年执业药师法规新版考试题库及答案详解
- 2026年体育教育专业技能考试试题及答案
- “艇身而出”皮划艇运动项目活动策划
- 2026年内分泌科医生上半年工作总结
- 中医脉诊客观化检测设备研发进展与循证医学验证
- 高边坡危岩清除专项施工方案
- 2026福建三明永安市永翔发展集团有限公司公开招聘工作人员4人考试模拟试题及答案详解
- 2026年公务员行测5000题刷题库
- 常德职业技术学院单招职业技能考试题库带答案
- 菌根化苗木造林:技术、成效与前景探究
- 2026年药店营业员药品知识与销售技巧培训
- 2026舞蹈艺术行业市场深度调研及商业运营模式创新报告
- 2026辽宁大连中远海运川崎船舶工程有限公司招聘137人笔试历年备考题库附带答案详解
评论
0/150
提交评论