【问题标题】:Neo4j Cypher query empty collect makes the entire result emptyNeo4j Cypher 查询空收集使整个结果为空
【发布时间】:2016-10-24 16:13:48
【问题描述】:

我一直面临着奇怪的问题,我试图从我构建的 neo4j 图中获取数据。这是我的查询

MATCH (u1:User {user_id: 4})-[:FOLLOWS]->(u2:User)-[]->(r1:Rest{city_id: 1})
WITH COLLECT ({ REST: r1.res_id}) as rows
MATCH (u1:User {user_id: 4})-[rel]->(r2:Rest{city_id: 1})
WHERE NOT (u1:User {user_id: 4})-[rel : BEEN_THERE | ADD_REVIEW]->(r2:Rest{city_id: 1})
WITH rows + COLLECT ({ REST: r2.res_id}) AS allrows
UNWIND allrows as row 
RETURN row.REST as RESTAURANT_ID, count(row.REST) as COUNT
ORDER BY COUNT desc
LIMIT 15;

但是,当 COLLECT ({ REST: r2.res_id}) 的结果为空时,整个结果将变为空。此外,查询无法识别第一个匹配的行并返回未定义的rows。请告诉我。谢谢!

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    如果模式与任何路径都不匹配,则结果确实为空。

    您必须将 MATCH 拆分为 2 并制作第二个 OPTIONAL,或者在您的实际情况下,停止一遍又一遍地匹配相同的 u1 节点:

    MATCH (u1:User {user_id: 4})
    OPTIONAL MATCH (u1)-[:FOLLOWS]->(:User)-->(r1:Rest {city_id: 1})
    WITH u1, collect({ REST: r1.res_id }) AS rows
    OPTIONAL MATCH (u1)-->(r2:Rest {city_id: 1})
    WHERE NOT (u1)-[:BEEN_THERE | ADD_REVIEW]->(r2)
    WITH rows + collect({ REST: r2.res_id }) AS allrows
    UNWIND allrows as row 
    RETURN row.REST AS RESTAURANT_ID, count(row.REST) AS COUNT
    ORDER BY COUNT desc
    LIMIT 15
    

    我不确定第一个 OPTIONAL MATCH 在你的情况下(你只提到第二个 collect 是一个阻止程序),但是如果你想要两个模式的聚合,每个模式都可以是空的,你可以.

    【讨论】:

    • 非常感谢弗兰克的回答!它工作正常。
    • @AditKaushal 不要犹豫accept (and vote for) 答案。
    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多