【图形数据库】基本查询

本文介绍了在创建Neo4j属性图数据库时如何设计数据模型,包括节点标签(如Person和bornMovie)及其属性,以及关系类型和属性。此外,文章详细解释了Cypher查询语法,演示了如何使用MATCH和RETURN子句进行节点和关系查询,以及如何删除整个图数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本查询:

在创建属性图数据库之前,开发适当的数据模型非常重要。 这将为数据提供结构,并允许图形用户有效地检索他们正在寻找的信息。

以下数据模型用于 Neo4j 数据模型:

创建数据模型:

它包括两种类型的节点标签:

  • Person节点,它们具有以下属性:和 .nameborn

  • Movie节点,具有以下属性:、 和 。titlereleasedtagline

数据模型还包含 和 节点之间的五种不同关系类型:、 、 、 和 。其中两种关系类型具有属性:PersonMovieACTED_INDIRECTEDPRODUCEDWROTEREVIEWED

关系类型,该类型具有属性。ACTED_INroles

关系类型,它具有属性和属性。REVIEWEDsummaryrating

创建属性图数据库

该子句用于查找图中的特定模式,例如特定节点。 该子句指定要返回的找到的图形模式。MATCHRETURN

例如,此查询将查找具有 label 和 name 的节点,并返回找到的节点的 and 属性:PersonKeanu Reevesnameborn

MATCH (keanu:Person {name:'Keanu Reeves'})
RETURN keanu.name AS name, keanu.born AS born

还可以查询多个节点的图形。 此查询将所有节点与标签进行匹配,并将结果限制为仅包含五行。Person

MATCH (people:Person)
RETURN people
LIMIT 5

关于从句组成的说明

与 SQL 类似,Cypher 查询是使用各种子句构建的,这些子句链接在一起以在彼此之间提供中间结果。 每个子句都有图形的状态和由引用变量组成的中间结果表作为输入。 第一个子句将查询前的图形状态和中间结果的空表作为输入。 子句的输出是图形的新状态和中间结果的新表,用作下一个子句的输入。 最后一个子句的输出是查询的结果。

请注意,如果其中一个子句返回一个中间结果的空表,则没有任何东西可以传递给后续子句,从而结束查询。 (有一些方法可以规避这种行为。 例如,将子句替换为 OPTIONAL MATCH。MATCH

在下面的示例中,第一个子句查找带有标签的所有节点。 然后,第二个子句将过滤这些节点以查找 1980 年代出生的所有节点。 最后子句按时间降序返回结果。MATCHPersonPerson

MATCH (bornInEighties:Person)
WHERE bornInEighties.born >= 1980 AND bornInEighties.born < 1990
RETURN bornInEighties.name as name, bornInEighties.born as born
ORDER BY born DESC

查找连接的节点

若要发现节点如何相互连接,必须将关系添加到查询中。 查询可以指定关系类型、属性和方向,以及模式的起点和终点节点。

例如,以下查询匹配电影《黑客帝国》导演的图形,并返回其导演的属性。name

MATCH (m:Movie {title: 'The Matrix'})<-[d:DIRECTED]-(p:Person)
RETURN p.name as director

还可以查找将节点相互连接的关系类型。 下面的查询在图形中搜索从节点到任何节点的传出关系,并返回与他相关的电影的关系和标题。Tom HanksMovie

MATCH (tom:Person {name:'Tom Hanks'})-[r]->(m:Movie)
RETURN type(r) AS type, m.title AS movie

结果显示,他有 13 个传出关系连接到 12 个不同的节点(12 个具有类型,1 个具有类型)。MovieACTED_INDIRECTED

 

可以通过向子句添加标签表达式来进一步修改 Cypher 查询。 例如,下面的查询使用标签表达式 () 返回连接到的所有非类型关系。NOT!Tom HanksACTED_IN

MATCH (:Person {name:'Tom Hanks'})-[r:!ACTED_IN]->(m:Movie)
Return type(r) AS type, m.title AS movies

查找路径

要搜索固定长度的模式,请使用量词 () 指定模式中节点之间的距离(跃点)。 例如,以下查询正好匹配距离 2 跃点的所有节点,并返回前五行。 DISTINCT 运算符确保结果不包含重复值。{n}PersonTom Hanks

MATCH (tom:Person {name:'Tom Hanks'})--{2}(colleagues:Person)
RETURN DISTINCT colleagues.name AS name, colleagues.born AS bornIn
ORDER BY bornIn
LIMIT 5

也可以为可变长度的模式匹配图形。 以下查询匹配 Hops 之间的所有节点,并返回前五行。Person14Tom Hanks

MATCH (p:Person {name:'Tom Hanks'})--{1,4}(colleagues:Person)
RETURN DISTINCT colleagues.name AS name, colleagues.born AS bornIn
ORDER BY bornIn, name
LIMIT 5

若要查找两个节点之间的最短路径,请使用该算法。 例如,此查询匹配两个节点之间的图中最岸路径,并且:shortestPathTom HanksKeanu Reeves

MATCH p=shortestPath(
(:Person {name:"Keanu Reeves"})-[*]-(:Person {name:"Tom Hanks"})
)
RETURN p

它表明,这是由影评人拍摄的,也是由影评人拍摄的。Keanu ReevesACTED_INMovieThe ReplacementsREVIEWEDJessica ThompsonREVIEWEDMovieThe Da Vinci CodeTom HanksACTED_IN

查找建议

Cypher 允许更复杂的查询。 以下查询尝试推荐合作演员,他尚未与之合作,但他的合作者已与之合作。 然后,查询按匹配的合作演员与基努·里维斯的一位合作演员合作的频率对结果进行排序。Keanu Reeves

MATCH (keanu:Person {name:'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(coActors:Person),
  (coActors:Person)-[:ACTED_IN]->(m2:Movie)<-[:ACTED_IN]-(cocoActors:Person)
WHERE NOT (keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) AND keanu <> cocoActors
RETURN cocoActors.name AS recommended, count(cocoActors) AS strength
ORDER BY strength DESC
LIMIT 7

电影数据库中的 和 节点之间有多个连接,但两者从未在电影中一起工作过。 以下查询通过查找在不同电影中与两人合作过的合作演员来匹配可以介绍这两者的合作演员:Keanu ReevesTom Hanks

MATCH (:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor:Person),
  (coActor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(:Person {name:'Tom Hanks'})
RETURN DISTINCT coActor.name AS coActor

删除图表

若要删除图形中的所有节点和关系,请运行以下查询:

MATCH (n)
DETACH DELETE n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值