下面的示例使用公开的Neo4j 电影数据库。
创建数据模型
在创建属性图表数据库之前,开发适当的数据模型非常重要。这将为数据提供结构,并允许图表用户高效地检索他们正在寻找的信息。
Neo4j 数据模型采用以下数据模型:
它包括两种类型的节点标签:
-
Person
节点具有以下属性:name
和born
。 -
Movie
节点具有以下属性:title
、released
和tagline
。
数据模型还包含Person
和Movie
节点之间的五种不同关系类型:ACTED_IN
、DIRECTED
、PRODUCED
、WROTE
和REVIEWED
。其中两种关系类型具有属性:
-
关系
ACTED_IN
类型,具有roles
属性。 -
关系
REVIEWED
类型,它有一个summary
属性和一个rating
属性。
要了解有关图形数据库数据建模的更多信息,请参加 GraphAcademy 提供的免费图形数据建模基础课程。
创建属性图形数据库
创建 Neo4j 电影数据库的完整 Cypher 查询可在此处找到。要创建完整图表,请针对空 Neo4j 数据库运行完整查询。
查找节点
该MATCH
子句用于查找图中的特定模式,例如特定节点。该RETURN
子句指定要返回找到的图形模式中的哪些内容。
例如,此查询将查找具有Person
标签和名称的节点Keanu Reeves
,并返回找到的节点的name
和属性:born
MATCH (keanu:Person {name:'Keanu Reeves'})
RETURN keanu.name AS name, keanu.born AS born
姓名 | 出生 |
---|---|
行:1 | |
|
|
还可以查询图中的多个节点。此查询会匹配所有带标签的节点Person
,并将结果限制为仅包含五行。
MATCH (people:Person)
RETURN people
LIMIT 5
人们 |
---|
行:5 |
|
|
|
|
|
关于条款组成的说明
与 SQL 类似,Cypher 查询使用各种子句构建,这些子句链接在一起以在彼此之间提供中间结果。每个子句的输入都是图的状态和由引用变量组成的中间结果表。第一个子句将查询前的图的状态和一个空的中间结果表作为输入。一个子句的输出是图的新状态和新的中间结果表,作为下一个子句的输入。最后一个子句的输出是查询的结果。
请注意,如果其中一个子句返回中间结果的空表,则没有任何内容可以传递给后续子句,从而结束查询。(有办法可以避免这种行为。例如,用OPTIONAL MATCHMATCH
替换子句。)
在以下示例中,第一个MATCH
子句查找所有带有Person
标签的节点。第二个子句随后将过滤这些节点以查找所有Person
出生于 1980 年代的节点。最后一个子句按时间降序返回结果。
MATCH (bornInEighties:Person)
WHERE bornInEighties.born >= 1980 AND bornInEighties.born < 1990
RETURN bornInEighties.name as name, bornInEighties.born as born
ORDER BY born DESC
姓名 | 出生 |
---|---|
行:4 | |
|
|
|
|
|
|
|
|
查找连通节点
要发现节点如何相互连接,必须将关系添加到查询中。查询可以指定关系类型、属性和方向,以及模式的起始节点和终止节点。
例如,以下查询与电影《黑客帝国》的导演的图表匹配,并返回name
其导演的属性。
MATCH (m:Movie {title: 'The Matrix'})<-[d:DIRECTED]-(p:Person)
RETURN p.name as director
导演 |
---|
行:2 |
|
|
还可以查找将节点彼此连接起来的关系类型。以下查询在图中搜索从节点Tom Hanks
到任何Movie
节点的传出关系,并返回与该节点相关的关系和电影名称。
MATCH (tom:Person {name:'Tom Hanks'})-[r]->(m:Movie)
RETURN type(r) AS type, m.title AS movie
结果显示,他有 13 个传出关系,连接到 12 个不同的Movie
节点(12 个具有ACTED_IN
类型,1 个具有DIRECTED
类型)。
类型 | 电影 |
---|---|
行数:13 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可以通过向子句添加标签表达式来进一步修改 Cypher 查询。例如,以下查询使用NOT
标签表达式 ( !
) 返回所有连接到Tom Hanks
且类型不为 的关系ACTED_IN
。
MATCH (:Person {name:'Tom Hanks'})-[r:!ACTED_IN]->(m:Movie)
Return type(r) AS type, m.title AS movies
类型 | 电影 |
---|---|
行:1 | |
|
|
查找路径
有多种方法可以使用 Cypher 在图中搜索节点之间的路径。
要搜索固定长度的模式,请使用量词( )指定模式中节点之间的距离(跳数{n}
)。例如,以下查询匹配Person
距离正好 2 跳的所有节点Tom Hanks
并返回前五行。DISTINCT运算符可确保结果不包含重复值。
MATCH (tom:Person {name:'Tom Hanks'})--{2}(colleagues:Person)
RETURN DISTINCT colleagues.name AS name, colleagues.born AS bornIn
ORDER BY bornIn
LIMIT 5
姓名 | 出生在 |
---|---|
行:5 | |
|
|
|
|
|
|
|
|
|
|
还可以匹配长度可变的模式图。以下查询匹配介于和Person
之间的所有节点,并返回前五行。1
4
Tom 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
姓名 | 出生在 |
---|---|
行:5 | |
|
|
|
|
|
|
|
|
|
|
上述两个示例中使用的量词是在 Neo4j 5.9 中量化路径模式发布时引入的。在此之前,Cypher 中匹配可变长度路径的唯一方法是使用可变长度关系。此语法在 Cypher 中仍然可用。在此处阅读更多信息。 |
要查找两个节点之间的最短路径,请使用shortestPath
算法。例如,此查询匹配图中两个节点Tom Hanks
和之间的最短路径Keanu Reeves
:
MATCH p=shortestPath(
(:Person {name:"Keanu Reeves"})-[*]-(:Person {name:"Tom Hanks"})
)
RETURN p
这是返回的路径:
它表明,Keanu Reeves
ACTED_IN
这Movie
The Replacements
是REVIEWED
由电影评论家撰写的Jessica Thompson
,他也是REVIEWED
其中Movie
The Da Vinci Code
的一位Tom Hanks
ACTED_IN
。
更多信息可以在“模式”部分找到。
查找建议
Cypher 允许更复杂的查询。以下查询尝试推荐 的合作演员Keanu Reeves
,他尚未与这些演员合作过,但他的合作演员曾与这些演员合作过。然后,该查询根据匹配的合作演员与 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
受到推崇的 | 力量 |
---|---|
行:5 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Keanu Reeves
电影数据库中的和节点之间存在多种联系Tom 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
联合演员 |
---|
行:2 |
|
|
删除图表
要删除图中的所有节点和关系,请运行以下查询:
MATCH (n)
DETACH DELETE n