2.4.3 查询关系
接下来讲解MATCH指令更多的用法。
2.4.3.1 查找演员参演的电影
【程序2-8】查找“Tom Hanks”参演过的电影的名称
上述指令首先匹配节点类型为Person、属性为{name: "Tom Hanks"}的节点,然后匹配这些节点中具有关系[:ACTED_IN],并且此关系指向某个电影节点的节点。返回结果如图2-60所示。
图2-60 Tom Hanks参演过的电影
通过结果可以看到演员Tom Hanks参演过的所有电影。
【程序2-9】查找谁导演了电影“Cloud Atlas”
上面指令首先匹配属性为{title: "Cloud Atlas"}的节点,然后匹配这些节点中具有关系[:DIRECTED]并且是被某个节点指向的节点,再返回匹配节点的name属性。返回结果如图2-61所示。
图2-61 电影Cloud Atlas的导演名单
通过结果可以看到Lily Wachowski、Lana Wachowski、Tom Tykwer导演了电影Cloud Atlas。
【程序2-10】查找与Tom Hanks同出演过电影的人
上面指令首先匹配节点类型为Person、属性为{name:"Tom Hanks"}的节点,然后匹配这些节点中通过[:ACTED_IN]关系指向的节点m,并且同时匹配某个节点coActors也通过[:ACTED_IN]关系指向的节点m,然后返回匹配节点m的name属性。返回结果如图2-62所示。
图2-62 与Tom Hanks出演过同一部电影的人
这样就查出了与Tom Hanks出演过同一部电影的人的姓名。
【程序2-11】查找与电影“Cloud Atlas”相关的所有人
上面指令首先匹配节点类型为Person的节点,然后匹配节点类型为Movie、节点属性为{title:"Cloud Atlas"}的节点,最后匹配两者之间存在某种关系(无论是导演还是演员关系)的情况,然后将人名、电影的关系类型、电影的关系同时返回。返回结果如图2-63所示。
图2-63 与电影“Cloud Atlas”相关的所有人
通过结果可以看到返回了三列数据,这与RETURN语句后面的people.name、Type(relatedTo)、relatedTo相对应。
2.4.3.2 查询关系路径
你或许听说过“六度空间”理论,也就是说,世界上任何两个人,他们之间最多通过6条关系路径就可以相互联系到彼此。使用Neo4j的关系路径查询,可以查找任意深度的关系路径,也就很轻松地能够实现人脉关系查询了。
【程序2-12】查找与演员Kevin Bacon存在4条及以内关系路径的任何演员和电影
上面指令首先匹配节点类型为Person、属性为{name: " Kevin Bacon "}的节点,然后将关系深度限制为从1到4再进行遍历,最后返回匹配的所有节点。返回结果如图2-64所示。
图2-64 与演员Kevin Bacon存在4条及以内关系的演员和电影
通过结果可以看到演员Kevin Bacon的4度关系以内的演员和电影网络是很庞大的。
【程序2-13】查找与演员Kevin Bacon与Meg Ryan之间的最短关系路径
上面指令首先匹配节点类型为Person、属性为{name: "Kevin Bacon"}的节点,再匹配节点类型为Person、属性为{name: "Meg Ryan"}的节点,两者用[*]关系操作符相连,代表两者存在任意深度的关系,然后使用shortestPath方法返回两者在所有深度关系遍历路径中最短的一条。返回结果如图2-65所示。
图2-65 “Kevin Bacon”与“Meg Ryan”之间的最短关系路径
通过结果可以看到演员Meg Ryan与Tom Hanks同参演过Joe Versus the Volcano电影,而Tom Hanks与Kevin Bacon同参演过Apollo 13电影,这就是他们两者之间的最短关系路径。