neo4j 基本查询

下面的示例使用公开的Neo4j 电影数据库

创建数据模型

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

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

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

  • Person节点具有以下属性:nameborn

  • Movie节点具有以下属性:titlereleasedtagline

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

  • 关系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. 结果
姓名出生

行:1

"Keanu Reeves"

1964

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

询问
MATCH (people:Person)
RETURN people
LIMIT 5
表 2. 结果
人们

行:5

{"born":1964,"name":"Keanu Reeves"}

{"born":1967,"name":"Carrie-Anne Moss"}

{"born":1961,"name":"Laurence Fishburne"}

{"born":1960,"name":"Hugo Weaving"}

{"born":1967,"name":"Lilly Wachowski"}

关于条款组成的说明

与 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
表 3. 结果
姓名出生

行:4

"Emile Hirsch"

1985

"Rain"

1982

"Natalie Portman"

1981

"Christina Ricci"

1980

查找连通节点

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

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

询问
MATCH (m:Movie {title: 'The Matrix'})<-[d:DIRECTED]-(p:Person)
RETURN p.name as director
表 4. 结果
导演

行:2

"Lilly Wachowski"

"Lana Wachowski"

还可以查找将节点彼此连接起来的关系类型。以下查询在图中搜索从节点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类型)。

表 5. 结果
类型电影

行数:13

"ACTED_IN"

"Apollo 13"

"ACTED_IN"

"You’ve Got Mail"

"ACTED_IN"

"A League of Their Own"

"ACTED_IN"

"That Thing You Do"

"ACTED_IN"

"The Da Vinci Code"

"ACTED_IN"

"Cloud Atlas"

"ACTED_IN"

"Joe versus the Volcano"

"ACTED_IN"

"Cast Away"

"ACTED_IN"

"The Green Mile"

"ACTED_IN"

"Sleepless in Seattle"

"ACTED_IN"

"The Polar Express"

"ACTED_IN"

"Charlie Wilson’s War"

"DIRECTED"

"That Thing You Do"

可以通过向子句添加标签表达式来进一步修改 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
表 6. 结果
类型电影

行:1

"DIRECTED"

"That Thing You Do"

查找路径

有多种方法可以使用 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
表 7. 结果
姓名出生在

行:5

"Mike Nichols"

1931

"Ian McKellen"

1939

"James Cromwell"

1940

"Nora Ephron"

1941

"Penny Marshall"

1943

还可以匹配长度可变的模式图。以下查询匹配介于和Person之间的所有节点,并返回前五行。14Tom 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
表 8. 结果
姓名出生在

行:5

"Max von Sydow"

1929

"Clint Eastwood"

1930

"Gene Hackman"

1930

"Richard Harris"

1930

"Mike Nichols"

1931

要查找两个节点之间的最短路径,请使用shortestPath算法。例如,此查询匹配图中两个节点Tom Hanks和之间的最短路径Keanu Reeves

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

这是返回的路径:

它表明,Keanu Reeves ACTED_INMovie The ReplacementsREVIEWED由电影评论家撰写的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
表 9. 结果
受到推崇的力量

行:5

"Tom Hanks"

4

"John Hurt"

3

"Jim Broadbent"

3

"Halle Berry"

3

"Stephen Rea"

3

"Natalie Portman"

3

"Ben Miles"

3

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
表 10. 结果
联合演员

行:2

"Charlize Theron"

"Hugo Weaving"

删除图表

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

MATCH (n)
DETACH DELETE n

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京橙溪科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值