7

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

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++ 产品。

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

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

欢迎任何想法!

Neo4j 1.8.3,Linux

谢谢!

4

1 回答 1

0

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

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

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

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

于 2017-05-19T12:41:57.053 回答