【问题标题】:Neo4j count based on single relationship to node基于与节点的单一关系的 Neo4j 计数
【发布时间】:2018-12-06 14:13:47
【问题描述】:

我想查找所有参与所有指定电影的人,例如 2 部电影:“终结者”、“真实的谎言”

我有以下疑问:

MATCH (t:Title)-[:ACTS_IN]-(p:Principal)-[:ACTS_BY]->(n:Name) 
WHERE t.originalTitle IN ["The Terminator", "True Lies"] 
WITH n, collect(n) as names 
WHERE SIZE(names) >= 2 
RETURN n.primaryName

如果每个人在每部电影中只参与一次(:ACTS_BY 关系),效果很好。但是根据我的数据库架构设计,每个人在 Principal 和 Name 节点之间可以有 0-N :ACTS_BY 关系(例如同一个人可以同时是电影的制片人和演员)。

问题是,如果该人在一部电影中参与了 2 次以上,另一部电影参与了 0 次,则提到的 Cypher 查询还将返回该人(Name 节点),但我只需要返回 Name 节点案例该人参加了每部电影。

请帮助改进查询以实现它。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    要解决此问题,您需要获取 t, p, n 的不同值以清除重复项,然后再进行计数:

    MATCH (t:Title)-[:ACTS_IN]-(p:Principal)-[:ACTS_BY]->(n:Name) 
    WHERE t.originalTitle IN ["The Terminator", "True Lies"] 
    WITH DISTINCT t, p, n
    WITH n, count(n) as occurrences 
    WHERE occurrences >= 2 
    RETURN n.primaryName
    

    【讨论】:

    • 感谢您的回答。在以下情况下,它仍然返回James Cameron IN ["The Terminator", "SOME_FREAKY_NAME"],但我在数据库中没有电影SOME_FREAKY_NAME,在这种情况下,我希望结果为空
    • 我认为这是因为 James Cameron 有 4 个不同的 p,以下查询返回 MATCH (t:Title)-[:ACTS_IN]-(p:Principal)-[:ACTS_BY]->(n:Name) WHERE t.originalTitle IN ["The Terminator"] AND n.primaryName="James Cameron" RETURN DISTINCT p
    • 如何在查询中正确考虑(t:Title)(n:Name) 对的唯一1 个(p:Principal)
    • 我在跟踪时遇到了一些问题,您能否添加 Cypher 以重新创建图表的相关部分,以便我可以运行一些测试?
    • 谢谢,我想我找到了问题!我在数据库中有不止一个“终结者”条目……比如电影、视频游戏等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多