基本查询:
在创建属性图数据库之前,开发适当的数据模型非常重要。 这将为数据提供结构,并允许图形用户有效地检索他们正在寻找的信息。
以下数据模型用于 Neo4j 数据模型:
创建数据模型:
它包括两种类型的节点标签:
-
Person
节点,它们具有以下属性:和 .name
born
-
Movie
节点,具有以下属性:、 和 。title
released
tagline
数据模型还包含 和 节点之间的五种不同关系类型:、 、 、 和 。其中两种关系类型具有属性:Person
Movie
ACTED_IN
DIRECTED
PRODUCED
WROTE
REVIEWED
关系类型,该类型具有属性。ACTED_IN
roles
关系类型,它具有属性和属性。REVIEWED
summary
rating
创建属性图数据库
该子句用于查找图中的特定模式,例如特定节点。 该子句指定要返回的找到的图形模式。MATCH
RETURN
例如,此查询将查找具有 label 和 name 的节点,并返回找到的节点的 and 属性:Person
Keanu Reeves
name
born
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 年代出生的所有节点。 最后子句按时间降序返回结果。MATCH
Person
Person
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
RETURN p.name as director
还可以查找将节点相互连接的关系类型。 下面的查询在图形中搜索从节点到任何节点的传出关系,并返回与他相关的电影的关系和标题。Tom Hanks
Movie
RETURN type(r) AS type, m.title AS movie
结果显示,他有 13 个传出关系连接到 12 个不同的节点(12 个具有类型,1 个具有类型)。Movie
ACTED_IN
DIRECTED
可以通过向子句添加标签表达式来进一步修改 Cypher 查询。 例如,下面的查询使用标签表达式 () 返回连接到的所有非类型关系。NOT
!
Tom Hanks
ACTED_IN
Return type(r) AS type, m.title AS movies
查找路径
要搜索固定长度的模式,请使用量词 () 指定模式中节点之间的距离(跃点)。 例如,以下查询正好匹配距离 2 跃点的所有节点,并返回前五行。 DISTINCT 运算符确保结果不包含重复值。{n}
Person
Tom Hanks
RETURN DISTINCT colleagues.name AS name, colleagues.born AS bornIn
ORDER BY bornIn
LIMIT 5
也可以为可变长度的模式匹配图形。 以下查询匹配 Hops 之间的所有节点,并返回前五行。Person
1
4
Tom Hanks
RETURN DISTINCT colleagues.name AS name, colleagues.born AS bornIn
ORDER BY bornIn, name
LIMIT 5
若要查找两个节点之间的最短路径,请使用该算法。 例如,此查询匹配两个节点之间的图中最岸路径,并且:shortestPath
Tom Hanks
Keanu Reeves
(: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
(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 Reeves
Tom Hanks
(coActor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(:Person {name:'Tom Hanks'})
RETURN DISTINCT coActor.name AS coActor
删除图表
若要删除图形中的所有节点和关系,请运行以下查询:
MATCH (n) DETACH DELETE n