【问题标题】:neo4j group on relationships with distinct endpointsneo4j 与不同端点的关系组
【发布时间】:2014-08-27 15:31:29
【问题描述】:

这个(newbe-)问题是基于官方getting started with neo4j online-tutorial提供的数据库。

我的目标是创建一个查询,列出所有与两部以上电影相关的人。 数据库由 person 和 movie 类型的节点组成。节点通过“ACTED_IN”、“DIRECTED”、“WROTE”或“PRODUCED”等关系连接。

数据库指出,吉恩·哈克曼出演了三部不同的电影,而卡梅隆·克劳导演、制作和编写了一部电影。所以卡梅隆与一部电影有三种关系,而吉恩与三部不同的电影有联系。存在更多节点和连接。

我目前的查询如下:

match (p:Person)-[r]->(m:Movie) with p, count(r) as rel where rel > 2 return p;

这将返回:

  • 基因哈克曼
  • 汤姆克鲁斯
  • 卡梅隆·克劳

Gene 和 Tom 分别出演过三部不同的电影,所以这是正确的。 如上所述,卡梅伦的所有关系都去看同一部电影,这不是我的意图。该查询不应返回此列表中的 Cameron,而应仅返回前两个人。

显然,我可以只使用“ACTED_IN”关系,但我还想列出不是演员的人,例如写过三部电影或更多电影的作者。

我想到的另一个问题是:

match (m:Movie)<-[ra]-(p:Person)-[rb]->(b:Movie) ...

不幸的是,这将连接数限制为恰好两个。

在计算人和电影之间的关系时,是否可以以只包括不同电影的方式调整第一个查询?

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    试试这个查询:

    match (p:Person)-[r]->(m:Movie)
    with p, count(r) as rel, count(distinct(endNode(r))) as q
    where rel > 2 and q = 1 return p;
    

    它所做的是从关系中提取结束节点。你想要的是只有一部这样的电影,以摆脱卡梅伦克劳问题。

    【讨论】:

    • 如果将最后一行更改为:where rel &gt; 2 and q != 1 return p;q = 1 仅返回 Cameron,因为他只有一个不同的端节点(我假设)q !=1 按预期返回其他两个参与者。 /跨度>
    【解决方案2】:

    这是一个查询,可以满足您的需求。

    MATCH (p:Person)--(m:Movie)
    WITH p, collect(DISTINCT m) AS ms
    WHERE LENGTH(ms) > 2
    RETURN p
    

    你并不真正关心关系类型,所以不用担心。您收集每个人的不同电影,如果不同电影的数量大于您的阈值,则返回该人。

    恩典与和平,

    吉姆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多