CN104391964A - 一种将源代码存入图数据库的方法 - Google Patents

一种将源代码存入图数据库的方法 Download PDF

Info

Publication number
CN104391964A
CN104391964A CN201410720349.2A CN201410720349A CN104391964A CN 104391964 A CN104391964 A CN 104391964A CN 201410720349 A CN201410720349 A CN 201410720349A CN 104391964 A CN104391964 A CN 104391964A
Authority
CN
China
Prior art keywords
node
source code
relation
database
statement
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201410720349.2A
Other languages
English (en)
Inventor
张天
朱晓倩
李宣东
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201410720349.2A priority Critical patent/CN104391964A/zh
Publication of CN104391964A publication Critical patent/CN104391964A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/33Querying

Abstract

本发明公开了一种将源代码存入图数据库的方法。该方法将源代码中的声明、语句和表达式根据语法树上的节点生成相应的节点,并根据语法树上的节点关系生成节点之间的关系,然后将节点和节点之间的关系存入图数据库中。相比于传统文本格式存储的方法,本发明的方法提取了丰富的代码结构信息存入了数据库,利于后续使用。相比于利用关系数据库存储代码,本发明的方法省去了表与表之间复杂的依赖关系,因此更加直观易懂,便于需求者的理解和操作。

Description

一种将源代码存入图数据库的方法
技术领域
本发明涉及软件工程领域中的程序分析以及数据库的操作。
背景技术
近年来,随着互联网的普及,网络中的各种数据呈现出爆炸性的增长,这其中也包括了在互联网中共享的开源代码。Sourceforge,Google code等开源代码库给了人们大量可供参考的源代码。如何从海量的代码中找到自己需要的内容,对代码库中的代码进行分析,越来越成为一种重要的需求。然而,目前大部分开源代码库只支持关键字检索,而检索的结果常常需要进一步进行筛选以确认是否是自己想要的的代码,这样的代码查询显然是低效而繁琐的。
代码并不仅仅是简单的文本,代码是有结构的,每种代码语言都有各自的语法规则,而这些规则正体现了代码中各个元素之间的关系。如果能够充分利用这些结构信息,将大大提高代码查询的效率,而最直接的想法就是构造一个新型的代码库来存放这些信息。
所有这些结构信息都能够使用实体以及实体之间的关系来表示,目前描述关系的数据库主要是关系型数据库。然而,代码中元素种类众多,元素之间关系复杂,这意味着想要完整记录代码结构信息需要数十个表,加上表与表之间的依赖关系(外键等),加大了对信息进行理解和操作的难度。此外,关系型数据库使用的二维表结构在处理高并发、海量的数据读写方面效率低下,扩展性差。因此,关系型数据库不能很好地满足用户的需求。
NOSQL数据库,也即非关系数据库,是近年来飞速发展的一类数据库。图数据是非关系数据库的一种,擅于处理高度关联的数据,Neo4j是目前最流行的图数据库。Neo4j使用的基本数据结构是图,主要涉及两类对象:节点和关系。其中,节点表示实体,每个节点可以拥有若干个属性来刻画实体信息,例如:(姓名:张三)表示节点有一个属性叫“姓名”,而属性的值为“张三”;关系对应于图中的边,可使用三元组<起始节点,关系类型,终止节点>来表征关系。每个关系都必须有唯一的类型,起始、终止节点表明关系的方向,同时关系也可以有自己的属性。Neo4j还支持给节点添加标签来将节点划分为不同的类别。Neo4j通过遍历来访问图中的节点和关系,图遍历执行的速度是常数(每秒遍历百万个关系),跟图的规模大小无关,极大地提高了性能。Neo4j拥有自己的查询语言Cypher,它是一种声明式语言,易于理解和学习。
JDT实际上就是Eclipse中提供的用于支持Java开发的一个插件,它提供了用户在Eclipse平台下进行Java语言开发的IDE。利用JDT,软件开发人员就可以在Eclipse工具中自由的编辑,编译,执行和调试Java程序。此外,JDT还提供了访问源代码编译过程中的中间结构的相关API,这个中间结构就是软件开发人员所熟悉的抽象语法树(AST)。对AST的利用可以使得对Java语言的源代码分析变得更加方便。软件开发人员在进行代码分析工作时就不再需要从Java源代码开始,先要通过词法分析、语法分析等获取代码结构信息,而是可以直接利用JDT的相关API获取相应代码的AST,并对AST中的信息进行分析工作。JDT所提供的AST除了具有数据结构严整,访问便捷,内容详细这些传统的抽象语法树的特性之外,还提供了对绑定等语义信息的支持,为面向Java语言的源代码的分析研究工作提供了很大的便利。
发明内容
本发明所要解决的问题是将源代码存入图数据库。
为解决上述问题,本发明采用的方案如下:
一种将源代码存入图数据库的方法,包括如下步骤:
S1:通过对源代码的静态语义分析,将源代码中的声明、语句和表达式生成节点,根据声明、语句和表达式之间的包含关系构建节点之间的关系;
S2:将生成的节点和节点之间的关系存入图数据库。
如权利要求1所述的将源代码存入图数据库的方法,其特征在于,所述将源代码中的声明、语句和表达式生成的节点根据源代码语法树上的节点定义。
进一步,所述步骤S1还包括将源代码文件生成节点,并根据源代码文件和源代码之间的关系构建节点之间的关系。
进一步,所述步骤S1还包括将多个源代码文件所组成的包生成节点,并根据包与源代码文件之间的关系构建节点之间的关系。
进一步,所述源代码为java代码。
进一步,所述的图数据库为Neo4j数据库。
本发明的技术效果如下:
1、相比于传统文本格式存储的方法,本发明的方法提取了丰富的代码结构信息存入了数据库,利于后续使用。
2、相比于利用关系数据库存储代码,本发明的方法省去了表与表之间复杂的依赖关系,因此更加直观易懂,便于需求者的理解和操作。
具体实施方式
下面对本发明做进一步详细说明。
本发明的将源代码存入图数据库的方法是主要通过源代码转化成图结构实现,即步骤S1:通过对源代码的静态语义分析,将源代码中的声明、语句和表达式生成节点,根据声明、语句和表达式之间的包含关系构建节点之间的关系。也就是将源代码中的声明、语句和表达式作为图结构上的节点,并将声明、语句和表达式之间的包含关系构建节点之间的关系作为节点之间的关系作为图结构上的节点之间的边。
将源代码中的声明、语句和表达式生成节点的方法有很多。其中,最为经典和成熟的是利用抽象语法树。下述实施方式中,源代码以java源代码为示例,图数据库以Neo4j数据库为示例。下述表1是以java语法树为蓝本,针对java代码建立的各种类型的节点。下述表2是表1中各类型节点之间的关系定义。表1中列出了80种节点类型,其中76种类型的节点都能够在java语法树上找到对应(括号中)。例如:ACD(AnonymousClassDeclaration))表示节点类型为ACD,其对应于java语法树中的AnonymousClassDeclaration。NT表示非终结,即可以有以该类节点为起始节点的关系;T表示终结,即没有以该类节点为起始节点的关系。属性栏列出了每类节点拥有的属性,例如:T_KEY:String表示该类节点拥有属性T_KEY且属性值的类型是String。有的属性的类型为DBR,这表示该属性的类型是在运行时决定的。对于像A(Annotation)这种类型的节点事实上是抽象节点,即它不会出现在图中,它有多个子节点MA,NA,SMA,子节点除了拥有自己特有的属性外还继承了父节点所有属性。“\”表示当前类型节点没有任何属性。由于java文件是语法树解析的单位,因此添加了P(Project)类型节点来组织同一项目下的所有java文件。表2中每一个表项<起始节点,类型,终止节点>对应于一个关系定义。“|”表示“或”,例如:<C,TYPES,ATD|ED|TD>表示这个关系的终止节点可以有3种,ATD、ED或TD。对于关系<起始节点,类型,终止节点>,数目表示从起始节点出发,该类型的关系可能的数目。0|1、1,*,1+,2+分别表示0个或1个、1个、0个或多个、1个或1个以上、2个或2个以上。
表1
表2
当java源代码存入Neo4j数据库时,首先利用Eclipse JDT对java源代码的语法树进行遍历,并在遍历过程中根据表1中定义获取各种类型的节点存入节点表,然后根据表2中定义的起始关系获得各个节点的关系存放至关系表中。最后再将上述java源代码获得的节点表和关系表中的信息存入至Neo4j数据库中。
节点表和关系表存入Neo4j数据库时,首先存入节点表中的节点,然后再存入关系表中的节点之间的关系。节点表中的节点存入Neo4j数据库时,遍历节点表中的各个节点,对每个节点做如下步骤的处理:
S21:根据节点类型和节点属性构建Cypher查询语句;
S22:通过Neo4j的REST API执行查询语句存储节点,返回节点在数据库中的编号。
关系表中的节点关系存入Neo4j数据库时,遍历关系表中的各个节点关系,对每个节点关系做如下步骤的处理:
S31:根据起止节点在数据库中的编号和节点关系的类型构建Cypher查询语句;
S32:通过Neo4j的REST API执行查询语句存储节点关系。
步骤S31中,起止节点是指节点关系的起始节点和终止节点。
下述为java代码Hello World的具体实例。其中源代码定义如下:
上述源代码经分析后得到的节点表如下:
表3
得到的关系表如下:
序号 起始节点编号 终止节点编号 关系类型
1 1 2 PACKAGE
2 1 3 TYPES
3 3 4 MODIFIERS
4 3 5 BODY_DECLARATIONS
5 5 6 MODIFIERS
6 5 7 MODIFIERS
7 5 8 RETURN_TYPE
8 5 9 PARAMETERS
9 9 10 TYPE
10 5 11 BODY
11 11 12 STATEMENTS
12 12 13 EXPRESSION
13 13 14 ARGUMENTS
表4
表3中的节点编号表示的是当节点存入数据库后返回的节点在数据库中的编号。表3中的节点编号和表4中的起始节点和终止节点的编号相对应。
表3中的第一个节点表示的是上述HelloWorld的java源代码所在的文件Hello World.java,表示的是源代码文件的节点;本领域技术人员理解,实际软件项目工程中包含了很多源代码文件。因此,在源代码文件的节点之上还可以构建工程节点P(Project)。
需要说明的是,上述实施方式中的java代码和Neo4j数据库以及采用的工具Eclipse JDT仅仅是本发明的示例,本领域技术人员理解,上述实施方式也可以适用于其他语言编写的源代码,图数据库也不限于Neo4j数据库,分析语法树的工具也不限于Eclipse JDT。

Claims (6)

1.一种将源代码存入图数据库的方法,其特征在于,包括如下步骤:
S1:通过对源代码的静态语义分析,将源代码中的声明、语句和表达式生成节点,根据声明、语句和表达式之间的包含关系构建节点之间的关系;
S2:将生成的节点和节点之间的关系存入图数据库。
2.如权利要求1所述的将源代码存入图数据库的方法,其特征在于,所述将源代码中的声明、语句和表达式生成的节点根据源代码语法树上的节点定义。
3.如权利要求1或2所述的将源代码存入图数据库的方法,其特征在于,所述步骤S1还包括将源代码文件生成节点,并根据源代码文件和源代码之间的关系构建节点之间的关系。
4.如权利要求3所述的将源代码存入图数据库的方法,其特征在于,所述步骤S1还包括将多个源代码文件所组成的包生成节点,并根据包与源代码文件之间的关系构建节点之间的关系。
5.如权利要求1所述的将源代码存入图数据库的方法,其特征在于,所述源代码为java代码。
6.如权利要求1所述的将源代码存入图数据库的方法,其特征在于,所述的图数据库为Neo4j数据库。
CN201410720349.2A 2014-12-01 2014-12-01 一种将源代码存入图数据库的方法 Pending CN104391964A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410720349.2A CN104391964A (zh) 2014-12-01 2014-12-01 一种将源代码存入图数据库的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410720349.2A CN104391964A (zh) 2014-12-01 2014-12-01 一种将源代码存入图数据库的方法

Publications (1)

Publication Number Publication Date
CN104391964A true CN104391964A (zh) 2015-03-04

Family

ID=52609868

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410720349.2A Pending CN104391964A (zh) 2014-12-01 2014-12-01 一种将源代码存入图数据库的方法

Country Status (1)

Country Link
CN (1) CN104391964A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109255088A (zh) * 2017-07-07 2019-01-22 普天信息技术有限公司 网页数据监测方法和设备
CN110704068A (zh) * 2019-10-18 2020-01-17 安徽中科国创高可信软件有限公司 基于数据库进行跨文件协同程序分析的处理方法及系统
CN112463149A (zh) * 2020-12-07 2021-03-09 中国科学院软件研究所 一种面向软件定义卫星的可复用代码库构建方法与装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101651683A (zh) * 2009-08-28 2010-02-17 重庆重邮东电通信技术有限公司 一种信令消息解析源代码生成方法
CN102521126A (zh) * 2011-12-05 2012-06-27 北京邮电大学 基于模块分解技术的软件缺陷检测系统的复杂性分析方法
CN103559025A (zh) * 2013-10-21 2014-02-05 沈阳建筑大学 一种采用聚类方式进行软件重构的方法
CN103927360A (zh) * 2014-04-18 2014-07-16 北京大学 基于图模型的软件项目语义信息表示及检索方法
US8881293B1 (en) * 2013-07-01 2014-11-04 Sap Se Static application security testing

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101651683A (zh) * 2009-08-28 2010-02-17 重庆重邮东电通信技术有限公司 一种信令消息解析源代码生成方法
CN102521126A (zh) * 2011-12-05 2012-06-27 北京邮电大学 基于模块分解技术的软件缺陷检测系统的复杂性分析方法
US8881293B1 (en) * 2013-07-01 2014-11-04 Sap Se Static application security testing
CN103559025A (zh) * 2013-10-21 2014-02-05 沈阳建筑大学 一种采用聚类方式进行软件重构的方法
CN103927360A (zh) * 2014-04-18 2014-07-16 北京大学 基于图模型的软件项目语义信息表示及检索方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
FABIAN YAMAGUCHI ET AL.: ""Modeling and Discovering Vulnerabilities with Code Property Graphs"", 《2014 IEEE SYMPOSIUM ON SECURITY AND PRIVACY》 *
S BATRA ET AL.: ""Comparative Analysis of Relational And Graph Databases"", 《INTERNATIONAL JOURNAL OF SOFT COMPUTING AND ENGINEERING》 *
洞庭小哥: ""抽象语法树简介"", 《HTTP://BLOG.CSDN.NET/DONGTINGZHIZI/ARTICLE/DETAILS/8019911》 *
王余蓝: ""图形数据库NEO4J与关系数据库的比较研究"", 《现代电子技术》 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109255088A (zh) * 2017-07-07 2019-01-22 普天信息技术有限公司 网页数据监测方法和设备
CN110704068A (zh) * 2019-10-18 2020-01-17 安徽中科国创高可信软件有限公司 基于数据库进行跨文件协同程序分析的处理方法及系统
CN110704068B (zh) * 2019-10-18 2023-02-17 安徽中科国创高可信软件有限公司 基于数据库进行跨文件协同程序分析的处理方法及系统
CN112463149A (zh) * 2020-12-07 2021-03-09 中国科学院软件研究所 一种面向软件定义卫星的可复用代码库构建方法与装置
CN112463149B (zh) * 2020-12-07 2022-07-19 中国科学院软件研究所 一种面向软件定义卫星的可复用代码库构建方法与装置

Similar Documents

Publication Publication Date Title
US20190266271A1 (en) Systems and Methods for Converting and Resolving Structured Queries as Search Queries
US9870392B2 (en) Retrieval method and system
CN102346747B (zh) 在数据模型中查找参数的方法
US20150178273A1 (en) Unsupervised Relation Detection Model Training
CN101620636B (zh) 一种显示表格数据的方法和装置
CN102479252A (zh) 查询语句转换装置及查询语句转换方法
US11914592B2 (en) Systems and methods for processing structured queries over clusters
US9262555B2 (en) Machine for recognizing or generating Jabba-type sequences
WO2015010509A1 (zh) 一种基于一维线性空间实现Trie树的词典检索方法
CN106874425B (zh) 基于Storm的实时关键词近似搜索算法
CN109564588A (zh) 学习数据过滤
JPWO2009095981A1 (ja) 表からツリー構造データを構築する方法及び装置
US10372736B2 (en) Generating and implementing local search engines over large databases
CN109885585A (zh) 支持存储过程、触发器与视图的分布式数据库系统和方法
CN113590894A (zh) 一种动态高效的遥感影像元数据入库检索方法
CN104391964A (zh) 一种将源代码存入图数据库的方法
Vrgoc et al. MillenniumDB: a persistent, open-source, graph database
Sakr et al. Hybrid query execution engine for large attributed graphs
CN103902651B (zh) 一种基于MongoDB的云端代码查询方法与装置
CN106156035A (zh) 一种通用文本挖掘方法和系统
Vrgoč et al. MillenniumDB: A Persistent, Open-Source, Graph Database
Schildgen et al. Marimba: A framework for making mapreduce jobs incremental
CN110990423A (zh) Sql语句的执行方法、装置、设备和存储介质
CN102637202A (zh) 一种迭代式概念属性名称自动获取方法和系统
KR101565715B1 (ko) 유향 동시발생 부분그래프 생성 장치 및 방법

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20150304

RJ01 Rejection of invention patent application after publication