【大数据】Neo4j图数据查询语句进阶

1,004 阅读3分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言

昨天的文章中,对数据进行了优化,为了使整个页面节点不那么冗余,因此删掉了节点关系中的版本和漏洞类型,并插入较大量的数据进行测试,实际使用看,节点方面能够达到预期,以公司为核心,产品为第二跳,漏洞为第三跳,展示对应公司有哪些产品,并且产品包含哪些漏洞。之后的设计是点击对应的CVE编号,能够弹出编号对应漏洞的详细信息。这部分之后再进行实现,而对于neo4j来说,最后就作为图数据库使用,其前端可视化由于优化的限制,并不能展示过多节点,因此会对查询操作封装为后端接口,查询语句就显得尤为重要,因此今天将对查询语句进行梳理,并封装为python类。


设置展示阈值

首先,neo4j的dashboard,对能够展示的节点数量进行了限制,一般默认为300,这个限制可以调大,如下图所示:

image.png

调大之后当match (n) returen (n)的时候可以返回全部节点,但是这样会很卡很卡,可以看到当我们将阈值设置为1000的时候,返回的1000节点如下图所示:

image.png


neo4j的查询节点语句

image.png

Cypher是一种声明式图查询语言,表达高效查询和更新图数据库。而Neo4j使用的就是Cypher的语法格式,因此查询语句使用match作为关键字进行模糊查询,并且通常会跟随这where关键字,想查询语句中添加过滤词对数据进行过滤,当查询语句为多个部分的时候,还会使用with关键字对上一部分的查询结果进行处理,并且将输出部分输入到下一个查询语句中。

image.png

查询所有节点

MATCH (n) RETURN n

image.png

查询所有节点id

match (n) return id(n)

image.png

查询特定标签

match (n:company) return n

image.png

查询特定标签与其属性

match (n:company) return n.name

image.png

查询特定节点

match (n:company{name:'microsoft'}) return n

image.png

查询特定节点的特定属性

match (n:company{name:'microsoft'}) return n.name

image.png

neo4j的查询关系语句

关系查询,是两个节点的事情,因此关系查询需要两个及以上的节点

根据节点查询关系节点

match (n:company{name:'microsoft'}) -->(product) return product

image.png

根据节点查询关系

match (n:company{name:'microsoft'}) -[r]-> (product) return r

image.png

根据节点查询关系图

match (n:company{name:'microsoft'}) -[r]-> (m:product) return m,r,n

image.png

查询多个关系

match (n:company{name:'microsoft'}) -[r]-> (m:product) - [t]->(o:cvenumberNode) return m,r,n,t,o

image.png

查询多个关系并指定关键字

match (n:company{name:'microsoft'}) -[r]-> (m:product{name:'office'}) - [t]->(o:cvenumberNode) return m,r,n,t,o

image.png

match (n:company{name:'microsoft'}) -[r]-> (m:product{name:'office'}) - [t]->(o:cvenumberNode{name:'CVE-2022-38049'}) return m,r,n,t,o

image.png

查询变长路径

MATCH (m)-[r*1]->(n) RETURN m, r, n

image.png

这样,基本的查询语句格式总结了一下,接下来将针对各个语句模式封装成接口,供前端调用,蟹蟹~