gpt4 book ai didi

neo4j - 分层样式查询在 Cypher 中的性能令人震惊。我应该使用 Traverser API 吗?

转载 作者:行者123 更新时间:2023-12-04 12:58:46 25 4
gpt4 key购买 nike

我的密码查询如下(我正在寻找在部门中购买的用户)

START n=node:sectors('SECTOR_ID:65, SECTOR_ID:66 ...') // 20 sectors  
MATCH (n)-[:HAS_DOMAIN]->(dom)-[:HAS_CAT]->(cat)<-[:BELONGS_TO]-(prod)-[:BOUGHT_BY]->(user)
RETURN n.sector_name, COUNT(user), COLLECT(DISTINCT(product.name)), ... etc.

我发现因为在每次遍历中路径的数量呈指数增长,
最终查询的结果时间为 25 秒。
所以,即如果一个部门有 50 个域,每个域有 1000 个类别,每个类别
拥有 250K++ 产品。

在我看来,这就是“ super 节点问题”……或者路径太多了!

我应该使用 Traverser API 吗?
我应该尝试以不同的方式为我的数据建模吗?

欢迎任何想法!

Neo4j 1.8.3,Linux

谢谢!

最佳答案

您的主要问题实际上是内存,因为您尝试加载所有路径。如果您需要统计数据,那么使用 Traverser API 几乎肯定会更好,以便您可以控制节点的加载/聚合方式。

如果您想坚持使用 Cypher,将每个扇区分解为它自己的查询可能会有所帮助,以便它们可以更好地并行运行。如果您可以完全控制数据库的读/写,那么另一个选项是创建分类帐节点,您可以在读/写时更新这些节点。这样,您不需要知道所有路径,只需知道这一更改如何影响统计信息。您还可以创建从扇区到有趣节点的直接关系,并将您想要的信息收集到单个元素中,例如

(sector)-[:HAS_CAT]->(cat)
WITH sector, collect(cat.name) as Categories

这样,在每次匹配时,您都可以合并回原来的列数。

关于neo4j - 分层样式查询在 Cypher 中的性能令人震惊。我应该使用 Traverser API 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19501180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com