【问题标题】:Neo4j query not returning correct resultNeo4j 查询未返回正确结果
【发布时间】:2016-04-21 10:14:21
【问题描述】:

我有 3 种类型的节点“项目”、“用户”、“公司”,它们的相关性如下:

(u : User)-[r:HAVE_DONATED{amount}]->(p : Project)
(c : Company)-[r:HAVE_DONATED{amount}]->(p : Project)

两个用户可以成为好友,可以勾选为

(u1 : User)-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2 : User)

如果上述条件成立,那么两个用户是朋友。

现在我必须找到我的朋友捐赠的所有项目以及捐赠者和捐赠者的数量。

Match (p : Project), (u1 : User {id : {id}}) with p, u1  
Optional Match (p)<-[r:HAVE_DONATED]-(u2) with a, u1, u2, r 
where (u1)-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2) 
with p, count(u2) as donors, sum(toInt(r.amount)) as donations  
return {id : p.id, donor : donors, donation : donations} as project 

这个查询给了我正确的项目,但问题是捐赠者和捐赠不正确。在捐赠者和捐赠中,它只计算用户的贡献,而不是(用户和公司)两者的贡献。我想要用户和公司的联合捐赠。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [编辑]

    要查找用户的朋友捐赠的所有项目,以及对这些项目的总捐赠,您可以使用以下查询:

    MATCH (u1:User {id : {id}})-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2:User)-[:HAVE_DONATE‌D]->(p:Project)
    MATCH (donor)-[r:HAVE_DONATED]->(p)
    WITH p, COUNT(donor) as donors, SUM(TOINT(r.amount)) AS donations
    RETURN {id: p.id, donors: donors, donations:donations} AS project;
    

    如果 ID 为 {id} 的用户没有为任何项目做出贡献的朋友,则查询不会返回任何内容。

    【讨论】:

    • 感谢您的查询,但此查询有一个小问题,捐赠时不会考虑非好友成员的捐赠。这将导致正确的项目,但不是正确的捐赠。 MATCH (u1:User {id: {id}})-[:HAS_ACCOUNT]->()-[:FRIEND]-() (p:Project) 可选匹配 (c)-[r2:HAVE_DONATED]->(p) WITH p, COUNT(c) 作为捐赠者,SUM(TOINT(r2.amount)) 作为捐赠返回 {id: p.id,捐赠者:捐赠者,捐赠:捐赠} AS项目
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多