活动源与汇总

时间:2016-03-22 22:40:20

标签: neo4j

我们的应用中的项目形成了树状结构。您可能有以下模式:

(c:card)-[:child]->(subcard:card)-[:child]->(subsubcard:card) ... etc

每次在卡片上(任何级别)执行操作时,我们都想录制它。以下是一些可能的事件:

  • Bob的名称更新了
  • Kate提到Joe
  • 添加了评论
  • 卡的状态已从待处理更改为已批准

链接列表方法似乎很受欢迎,但考虑到我们想要执行的各种查询,我不确定它是否对我们有效。

以下是我们将要运行的主要查询:

  • 与特定卡和子卡相关的所有活动,按事件的时间排序(基本上我们想将所有这些活动源合并在一起)
  • 与按时间排序的特定人员相关的所有活动

除此之外,我们还想添加如下过滤器:

  • 按相关人员过滤
  • 按时间段过滤

同样重要的是要注意,卡片可能会经常重新排列。换句话说,父母可能会改变。

关于如何最好地建模这样的东西的任何想法?谢谢!

1 个答案:

答案 0 :(得分:0)

我有几点建议,但我会建议对它们进行基准测试。

如果您可以使用Java API(可能通过Neo4j的非托管扩展),链接列表方法可能会很好。如果列表中的最新事件是附加到卡上的事件(并且基本上列表是在事件发生的日期之前排序的),那么如果您按时间过滤,则可以在您&#39时提前终止;我发现了一个早于指定时间的事件。

将事件直接附加到卡上可能会导致您遇到超级节点/密集节点的问题。不过,在Cypher中查询是最简单的。问题是Cypher会在过滤之前查看所有这些内容。除了将事件的日期/时间放在事件节点上,将其置于与节点((:Card)-[:HAS_EVENT]->(:Event)(:Event)-[:PERFORMED_BY]->(:Person))的关系之外,您还可以提高查询的性能。然后,当您查询时,您可以按关系进行过滤,以便它不需要遍历节点。

无论如何,打破查询可能会有所帮助:

MATCH (c:Card {uuid: 'id_here')-[:child*0..]->(child:Card)
WITH child
MATCH (child)-[:HAS_EVENT]->(event:Event)

认为这意味着MATCH将需要评估的路径排列更少。

欢迎其他人补充我的可疑建议,因为我从未真正亲自处理超节点,只是阅读它们;)

相关问题