【问题标题】:Neo4j - Returning multiple sets of rows for each nodeNeo4j - 为每个节点返回多组行
【发布时间】:2017-06-27 14:37:58
【问题描述】:

我有 1000 个员工节点,它们属于 7 个部门。我试图让财务部门的每个员工按降序发送给其他员工的前 10 条消息。我还想要他向其发送消息的员工部门。我正在根据这两个问题中给出的答案使用以下查询: return top n results for each query in Neo4jGetting top n records for each group in neo4j, 但我得到的结果是每个员工发送给每个部门其他员工的前 10 条消息(每个员工总共有 70 条消息)。我想要包括所有部门的结果,而不是每个部门的 10 个结果。

我使用的查询是:

MATCH(e:Employee{div:'finance'}),(b:Employee)
OPTIONAL MATCH (e)-[r:Message]->(b)
WITH e.name as em, b.division_name as bm,coalesce(r.NUMBER_OF_MESSAGES,0) 
as msg 
ORDER BY msg DESC 
WITH collect(msg) AS bts, em, bm
UNWIND bts[0..10] AS r
RETURN em, bm, r

我应该对此查询进行哪些更改?在此先感谢

【问题讨论】:

  • 您可以与我们分享一个 Cypher 脚本来构建示例数据集和预期结果吗?
  • 每个员工节点有 2 个属性他的名字和部门。它们之间的交互由关系“消息”给出,该关系具有属性“NUMBER_OF_MESSAGES”。这是我想要获得的输出类型的链接:1drv.ms/t/s!AoPLdWnC_z5RjuUiFQ9tdmoDa2BbfQ
  • 亲爱的 Bruno,该图是从 csv 文件构建的,我不确定如何为此构建示例。我希望我试图得到的输出对你有意义。

标签: neo4j cypher


【解决方案1】:

Ram,我认为使用 APOC Procedure apoc.cypher.run 是一个不错的选择。通过此过程,您将能够为在财务部门工作的每个员工运行“子查询”。请安装 APOC 程序并尝试一下:

MATCH(e:Employee{div:'finance'})
CALL apoc.cypher.run('
    WITH {e} AS e
    OPTIONAL MATCH (e)-[r:ACTED_IN]->(b:Employee)
    RETURN e.name, b.division_name, coalesce(r.NUMBER_OF_MESSAGES,0) as messages
    ORDER BY messages DESC
    LIMIT 10',
{e:e}) YIELD value
return value

注意:记得根据 Neo4j 的版本安装 APOC 程序。见this link

【讨论】:

  • 嗨布鲁诺,我试过这个。我只收到了 10 名按降序发送消息数量最多的员工。
  • @Ram,我用 APOC 程序的建议更新了答案。请尝试一下并告诉我结果。如果查询没有按预期工作,我会调整它。谢谢。
  • 亲爱的 Bruno,我已经安装了适当版本的 apoc 插件。我正在使用 neo4j 企业压缩版。我收到以下错误:apoc.cypher.run is not available due to having restricted access rights, check configuration.
  • @Ram,看看this link 的错误信息。
  • @Ram 我现在更新了查询中的拼写错误。请告诉我它是否适合你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多