我们的应用中的项目形成了树状结构。您可能有以下模式:
(c:card)-[:child]->(subcard:card)-[:child]->(subsubcard:card) ... etc
每次在卡片上(任何级别)执行操作时,我们都想录制它。以下是一些可能的事件:
链接列表方法似乎很受欢迎,但考虑到我们想要执行的各种查询,我不确定它是否对我们有效。
以下是我们将要运行的主要查询:
除此之外,我们还想添加如下过滤器:
同样重要的是要注意,卡片可能会经常重新排列。换句话说,父母可能会改变。
关于如何最好地建模这样的东西的任何想法?谢谢!
答案 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
将需要评估的路径排列更少。
欢迎其他人补充我的可疑建议,因为我从未真正亲自处理超节点,只是阅读它们;)