当前位置: 首页 > 知识库问答 >
问题:

一个节点具有大量关系的图的密码性能

唐海阳
2023-03-14

我有一个Neo4j图(版本2.2.2),其中包含大量关系。对于examaple:1个节点“组”,300000个节点“数据”,300000个从“组”到所有现有节点“数据”的关系。我需要检查数据节点集和特定组节点之间是否存在关系(例如,200个节点)。但我使用的密码查询非常慢。我尝试了许多修改这个密码,但没有结果。

创建图表的密码:

FOREACH (r IN range(1,300000) | CREATE (:Data {id:r}));
CREATE (:Group);
MATCH (g:Group),(d:Data) create (g)-[:READ]->(d);

查询1:成本。600003在730毫秒内的总db命中。可以接受,但我只要求1个节点。

PROFILE MATCH (d:Data)<-[:READ]-(g:Group) WHERE id(d) IN [10000] AND id(g)=300000 RETURN id(d);

查询2:COST。600003总db命中25793 ms。不可接受。

您需要替换“…”实际节点数从10000到10199

PROFILE MATCH (d:Data)<-[:READ]-(g:Group) WHERE id(d) IN [10000,10001,10002 " ..." ,10198,10199] AND id(g)=300000 RETURN id(d);

查询3:成本。309毫秒内总共有1000次db点击。这是我发现的唯一一个可以让查询被接受的解决方案。我在代码中返回了节点“Group”的所有id,并手动筛选结果,只返回id为300000的节点的关系

您需要替换“…”实际节点数从10000到10199

PROFILE MATCH (d:Data)<-[:READ]-(g:Group) WHERE id(d) IN [10000,10001,10002 " ..." ,10198,10199] RETURN id(d), id(g);

问题1:查询1中的总DB命中率令人惊讶,但我同意neoj的物理模型定义了该查询的执行方式-它需要查看节点“Group”中的每个现有关系。我接受这一点。但是,如果db命中数相同(执行计划相同),为什么查询1和查询2的执行时间有这么大的差异?我只返回节点的id,而不是大型属性集。

问题2:查询3是优化此查询的唯一解决方案吗?

共有1个答案

燕建中
2023-03-14

显然,2.2中的Cypher存在问题。x,带seekById

为了使用之前的Cypher PLANNER,您可以在查询前加上前缀“PLANNER RULE”,但您必须将模式一分为二,以使其非常快速,例如:

PLANNER RULE
MATCH (d:Data) WHERE id(d) IN [30]
MATCH (g:Group) WHERE id(g) = 300992
MATCH (d)<-[:READ]-(g)
RETURN id(d)

 类似资料:
  • 我是新4J的新手。 (Node1)-[Rel1]->(Node3) (每个节点和发布在'Rights'属性中都有'admin'字符串。) 如果用户具有正确的'user',则路径应为: (Node1)-[Rel2]-(Node2)-[Rel3]-(Node3) (因为Rel1关系在“Rights”属性中没有“user”字符串。) 谢了。

  • 从Neo4j 1.9开始。2,并使用Cypher查询语言,我希望在具有特定公共属性值的节点之间创建关系。我有一组具有属性H的节点G,在G节点之间当前不存在任何关系。 在Cypher语句中,是否可以按H属性值对G节点进行分组,并在成为同一组的每个节点之间创建关系HR?知道每个小组的人数在2人之间 我一直在努力管理这样的查询,但没有找到正确的语法。下面是一个小样本数据集: 最后,我希望有这样的关系:

  • 我想使用py2neo的OGM来表示从一个节点类型到两个节点类型的关系。 这段关系的“结束”应该指向一辆车,而不是一栋房子。但显然py2neo并不关心那么多,而是像预期的那样将所有东西都存储在数据库中:一个人、一辆车和一栋房子通过拥有关系连接起来。 现在的问题是使用上面的类来检索节点和关系。当节点属性正确加载时,关系不是: 这导致: 此行为与类对象一致。 我如何在py2neo.ogm中用同一个类建模

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢

  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?