【问题标题】:Cypher: What is the best way to match subgraphs based on several ASCII-snippets?Cypher:基于几个 ASCII 片段匹配子图的最佳方法是什么?
【发布时间】:2019-12-10 15:53:20
【问题描述】:

我正在学习 Cypher/Neo4j,并且正在使用电影图形数据集。 我想了解如何编写与更复杂的子图匹配的语句并返回整个子图。

例如,如果我想要同一部电影的演员和导演的子图,我可以使用:

MATCH (m:Movie) <-[:DIRECTED]-(p:Person) -[:ACTED_IN]-> (m:Movie)
RETURN *

但是,这仅适用于我正在寻找的子图是一条直线。如果我想扩展上述内容以匹配 A:导演他们出演的电影和 B:出演特定电影 - “电影 X”的人的子图,我不知道该怎么做。我知道我可以使用 WHERE 语句过滤掉演员没有在“电影 X”中表演的子图,但这不会返回代表“电影 X”的节点。

我想知道是否有办法构建这样的查询 - 如下所示:

MATCH (p:Person) -[:ACTED_IN]-> (m:Movie) AND
(p:Person) -[:DIRECTED]-> (m:Movie) AND
(p:Person)-[:ACTED_IN]->(:Movie {title: 'Movie X'})
RETURN *

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    您绝对是在正确的道路上。试试这个

    MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
    WHERE (p)-[:DIRECTED]->(m)
    AND (p)-[:ACTED_IN]->(:Movie {title: 'Movie X'})
    RETURN *
    

    在这种情况下,由于您已经知道您想要在电影 X 中表演的人,因此在这种特定情况下,更好的方法是立即匹配“电影 X”,例如...

    MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title: 'Movie X'})
    WHERE (p)-[:DIRECTED]->(m)
    RETURN *
    

    为了返回“电影 X”(虽然它应该是已经匹配的电影之一,但您需要在 MATCH 声明中识别它。您可以这样做...

    MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
    WHERE (p)-[:DIRECTED]->(m)
    WITH p, m
    MATCH (p)-[:ACTED_IN]->(m2:Movie {title: 'Movie X'})
    RETURN p, m, m2
    

    【讨论】:

    • 谢谢,但这不起作用,因为它不返回代表“电影 X”的节点,很遗憾。
    • 有趣。这是多余的,你可以在第一行匹配“Movie X”,但它应该可以工作。
    • 我了解“电影 X”条件在这种情况下不提供任何额外信息。但是,我只想能够控制是否返回节点。例如,如果我想返回代表 2000 年后发行的电影 p 的节点,那么返回节点也很重要。
    • 编辑中的查询与我尝试的不同。我正在寻找一个人 p 演过 + 导演过任何电影 m 的子图,并在特定的电影“电影 X”中演过戏。第一个识别正确的案例,但它不返回对应于两部电影的节点。
    • 啊,第三个正是我要找的。我不知道您可以将几个 MATCH 语句“链接在一起”。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多