【问题标题】:Problems with simple Cypher Query: complicated match statement简单 Cypher 查询的问题:复杂的匹配语句
【发布时间】:2019-10-19 21:03:36
【问题描述】:

我是 Neo4J 和 Cypher 的新手,因此决定尝试使用安装 Neo4J 桌面时提供的电影示例数据。

我想运行一个非常简单的查询,即检索涉及 3 个人的电影的标题,Liv Tyler、Charlize Theron 和 Bonnie Hunt。匹配两个人不是问题(见下面的代码),但包括第三个是困难的。

在 SQL 中,这对我来说不是问题,但 Cypher 会引起严重的头痛。这是到目前为止的查询:

MATCH (Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(Person {name: "Bonnie Hunt"}) 
RETURN  movie.title AS Title

我尝试使用AND 语句,但没有任何效果。 那么如何在此查询中包含 Charlize Theron?

【问题讨论】:

  • 请注意,这里没有使用标签。所有标签都必须以 : 开头,所以你应该使用类似 (:Person {name: "Liv Tyler"})

标签: neo4j cypher


【解决方案1】:

您可以使用多种模式将三个或更多连接匹配到单个节点。

您可以使用您在查询中使用的变量movie 来引用相同的Movie 节点以包含模式(:Person {name: "Charlize Thero"})-[:ACTED_IN]-&gt;(movie)。

MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(:Person {name: "Bonnie Hunt"}),
(:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie) 
RETURN  movie.title AS Title

您也可以将上述查询改写如下:

MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]->(movie:Movie),
    (:Person {name: "Bonnie Hunt"})-[:DIRECTED]->(movie),
    (:Person {name: "Charlize Theron"})-[:ACTED_IN]->(movie) 
RETURN  movie.title AS Title

【讨论】:

  • 非常感谢这些建议!我沿着这条路线走,但没有得到任何结果。事实证明,图表的可视化方式具有误导性。无论如何,再次感谢! :)
  • 因为数据库中没有这种模式。需要明确的是,没有这两位演员在 Bonnie Hunt 导演的电影 (IN THE DATABASE) 中出演。
  • 试试这个:MATCH (:Person {name: "Liv Tyler"})-[:ACTED_IN]-&gt;(movie:Movie), (:Person {name: "Tom Hanks"})-[:DIRECTED]-&gt;(movie), (:Person {name: "Charlize Theron"})-[:ACTED_IN]-&gt;(movie) RETURN movie.title AS Title
  • 确保您在该查询中使用:Person!否则,就像现在一样,这将不起作用,因为您对所有三个人都使用了 Person 变量,这将与任何内容都不匹配!
  • 感谢指点,复制问题时没有注意到:。
【解决方案2】:

如果您有任意数量的参与者(参数化),而您无法对相关的 :Person 节点进行硬编码,则可以改为在 :Person 节点上匹配参数列表中的名称,然后根据计数进行过滤找到的模式(你想确保所有在电影中表演的人都被计算在内)。

但如果我们首先为导演这样做,那么我们已经有了一些电影匹配,并且可以在演员列表上应用 all() 谓词以确保他们都在电影中表演。

假设两个列表参数,一个给演员,一个给导演:

MATCH (director:Person)-[:DIRECTED]->(m:Movie)
WHERE director.name in $directors
WITH m, count(director) as directorCount
WHERE directorCount = size($directors)
AND all(actor IN $actors WHERE (:Person {name:actor})-[:ACTED_IN]->(m))
RETURN m.title as Title

【讨论】:

  • 哦,谢谢,这也是另一种有用的方法!
猜你喜欢
  • 2013-11-11
  • 2019-12-30
  • 2017-05-28
  • 1970-01-01
  • 2021-11-12
  • 2012-09-06
  • 2018-12-24
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多