gpt4 book ai didi

neo4j - Neo4j:具有大量节点的缓慢聚合

转载 作者:行者123 更新时间:2023-12-04 19:49:11 26 4
gpt4 key购买 nike

我是Neo4j的新手。目前,我正在评估将Neo4j用于我们的一种使用案例。当我尝试与大量节点聚合时遇到问题。

我们正在使用Neo4j来存储对不同类别进行投票的访客。投票具有一个位置和一个引荐来源网址,我将其建模为单个节点以“重用”它们。
这大致是我的架构的样子(Node Vote具有其他关系,此处省略了其他关系):

(Visitor {id})-[VOTED]->(Vote)-[RELATES_TO]->(Category {name})


在Vistor.id和Category.name上具有索引

我们的数据集非常大,所以我开始以400万票和300万访问者的身份测试我的模式。投票涉及18个不同类别。
我希望能够进行汇总。例如,我需要获得投票给“类别A”和“类别B”的不同访问者的数量。

MATCH (c:Category)<-[:PARENT*0..3]-(child:Category)<-[:RELATES_TO]-(v:Vote)<-[:VOTED]-(visitor:Visitor)
WHERE c.name = 'Category A'
WITH visitor
MATCH (c:Category)<-[:RELATES_TO]-(v:Vote)<-[:VOTED]-(visitor)
WHERE c.name = 'Category B'
RETURN count(distinct(visitor.id)) as Cat_A_and_B_lovers


大约需要30秒

我还希望能够获得所有类别和不同票数:

MATCH (n:Category)<-[:RELATES_TO]-(:Vote)<-[:VOTED]-(v:Visitor)
RETURN n.name as category, count(DISTINCT v) as count;


这需要13秒。

是否可以改善这些时间,还是Neo4j不适用于此类分析?
我们还在按访问者级别分析数据-但也希望能够进行这些汇总。

我的设置:
Linux,4核14GB
Noe4j社区版
neo4j.conf:

dbms.memory.heap.initial_size = 2G
dbms.memory.heap.max_size = 10G
dbms.memory.pagecache.size = 10g


-更新15/02

按照Michael的建议,我能够缩短两个查询的执行时间。我的第一个查询:

PROFILE MATCH (n:Category)<-[:RELATES_TO]-()<-[:VOTED]-(v:Visitor)
WITH n, count(DISTINCT v) as count
RETURN n.name as category, count


配置文件输出:

9964毫秒

编译器CYPHER 3.1

策划者成本

运行时解释

+-------------------+----------------+---------+---------+--------------------------------------+------------------------------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+-------------------+----------------+---------+---------+--------------------------------------+------------------------------------+
| +ProduceResults | 1545 | 18 | 0 | category, count | category, count |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +Projection | 1545 | 18 | 18 | category -- count, n | {category : n.name, count : count} |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +EagerAggregation | 1545 | 18 | 0 | count -- n | n |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +Filter | 2386269 | 4114784 | 4114784 | anon[19], anon[35], anon[37], n, v | v:Visitor |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +Expand(All) | 2386269 | 4114784 | 8229568 | anon[37], v -- anon[19], anon[35], n | ()<-[:VOTED]-(v) |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +Expand(All) | 4113784 | 4114784 | 4114807 | anon[19], anon[35] -- n | (n)<-[:RELATES_TO]-() |
| | +----------------+---------+---------+--------------------------------------+------------------------------------+
| +NodeByLabelScan | 23 | 23 | 24 | n | :Category |
+-------------------+----------------+---------+---------+--------------------------------------+------------------------------------+


现在大约需要10秒钟。我需要将其设置在1秒以下。这完全可行吗(使用neo4j)?

最佳答案

不要配置比您更多的内存。

将页面缓存设置为4G,最小/最大堆设置为8

对于查询,最好使用EXPLAINPROFILE查看查询计划。

我推荐这样的东西:

MATCH (ca:Category)<-[:PARENT*0..3]-(child)<-[:RELATES_TO]-()<-[:VOTED]-(visitor)
WHERE ca.name = 'Category A'
WITH distinct visitor
MATCH (cb:Category)<-[:RELATES_TO]-()<-[:VOTED]-(visitor)
USING INDEX cb:Category(name)
WHERE cb.name = 'Category B'
RETURN count(distinct(visitor)) as Cat_A_and_B_lovers


您的原始查询在每个类别和投票中都有一个访客重复项,因此可能有很多重复项,对于每个重复项都执行第二次匹配。

每个类别树A您有多少位访客?
您也可以左右翻转两个,即先执行“ B”,然后执行“ A”。

MATCH (cb:Category)<-[:RELATES_TO]-()<-[:VOTED]-(visitor)
WHERE cb.name = 'Category B'
WITH distinct visitor
MATCH (ca:Category)<-[:PARENT*0..3]-(child)<-[:RELATES_TO]-()<-[:VOTED]-(visitor)
USING INDEX ca:Category(name)
WHERE ca.name = 'Category A'
RETURN count(distinct(visitor)) as Cat_A_and_B_lovers


同样,对于计数而言,当节点本身代表相同的概念时,对属性(visitor.id)进行计数只是成本高昂的,而且没有好处。

关于neo4j - Neo4j:具有大量节点的缓慢聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113288/

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