Neo4j 带有汇总的活动提要

Neo4j 带有汇总的活动提要,neo4j,Neo4j,我们的应用程序中的项目形成了树状结构。您可能有如下模式: (c:card)-[:child]>(subcard:card)-[:child]>(subsubcard:card)。。。etc 每次在卡上执行操作(在任何级别),我们都要记录它。以下是一些可能发生的事件: 卡片的标题由Bob更新 凯特在评论中提到乔 卡的状态从挂起更改为已批准 链表方法似乎很流行,但考虑到我们希望执行的查询种类,我不确定它是否对我们最有效 以下是我们将运行的主要查询: 与特定卡和子卡关联的所有活动,按事件时间排序

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

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

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

  • 卡片的标题由Bob更新
  • 凯特在评论中提到乔
  • 卡的状态从挂起更改为已批准
链表方法似乎很流行,但考虑到我们希望执行的查询种类,我不确定它是否对我们最有效

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

  • 与特定卡和子卡关联的所有活动,按事件时间排序(基本上我们希望将所有这些活动提要合并在一起)
  • 与特定人员相关的所有活动,按时间排序
除此之外,我们还希望添加如下过滤器:

  • 按相关人员筛选
  • 按时间段过滤
还需要注意的是,卡片可能会被频繁地重新排列。换句话说,父母可能会改变


有没有关于如何对这样的东西进行最佳建模的想法?谢谢

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

如果可以使用JavaAPI(可能通过Neo4j的非托管扩展),链表方法可能会很好。如果列表中的最新事件是附在卡上的事件(本质上,列表是按事件发生的日期排序的),那么如果按时间筛选,则在发现早于指定时间的事件时,可以提前终止

将事件直接附加到卡上可能会导致超级节点/密集节点出现问题。不过,在Cypher中查询是最简单的。问题是Cypher在过滤之前会查看所有这些文件。除了将事件的日期/时间放在事件节点上,还可以将其放在与节点的关系上(
(:Card)-[:HAS_event]->)(:event)
(:event)-[:PERFORMED_]->(:Person)
)来提高查询的性能。然后,当您查询时,可以根据关系进行过滤,这样就不需要遍历到节点

无论如何,这样分解查询可能会有所帮助:

MATCH (c:Card {uuid: 'id_here')-[:child*0..]->(child:Card)
WITH child
MATCH (child)-[:HAS_EVENT]->(event:Event)
我认为这意味着
匹配
需要计算的路径排列将更少


欢迎其他人补充我可疑的建议,因为我从来没有亲自处理过超级节点,只要看看它们;)

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

如果可以使用JavaAPI(可能通过Neo4j的非托管扩展),链表方法可能会很好。如果列表中的最新事件是附在卡上的事件(本质上,列表是按事件发生的日期排序的),那么如果按时间筛选,则在发现早于指定时间的事件时,可以提前终止

将事件直接附加到卡上可能会导致超级节点/密集节点出现问题。不过,在Cypher中查询是最简单的。问题是Cypher在过滤之前会查看所有这些文件。除了将事件的日期/时间放在事件节点上,还可以将其放在与节点的关系上(
(:Card)-[:HAS_event]->)(:event)
(:event)-[:PERFORMED_]->(:Person)
)来提高查询的性能。然后,当您查询时,可以根据关系进行过滤,这样就不需要遍历到节点

无论如何,这样分解查询可能会有所帮助:

MATCH (c:Card {uuid: 'id_here')-[:child*0..]->(child:Card)
WITH child
MATCH (child)-[:HAS_EVENT]->(event:Event)
我认为这意味着
匹配
需要计算的路径排列将更少


欢迎其他人补充我可疑的建议,因为我从来没有亲自处理过超级节点,只要看看它们;)

谢谢Brian:)。Neo4j允许按范围索引排序吗?例如,如果我有事件节点时间戳,我是否能够高效地查询1。在一定的时间范围内和2。属于子对象?Neo4j肯定可以使用索引对范围进行更快的查询(从2.3开始)。诀窍是确保它能找出哪一个地方是最有限的开始。如果您认为按事件日期筛选会给您提供较小的起点,那么您可以从对事件进行
匹配开始。谢谢Brian:)。Neo4j允许按范围索引排序吗?例如,如果我有事件节点时间戳,我是否能够高效地查询1。在一定的时间范围内和2。属于子对象?Neo4j肯定可以使用索引对范围进行更快的查询(从2.3开始)。诀窍是确保它能找出哪一个地方是最有限的开始。如果您认为按事件日期筛选将为您提供较小的起点,那么您可以从
MATCH
ing事件开始。