具有属性的单个节点需要永远查询

时间:2016-12-09 03:54:51

标签: neo4j cypher

我有一个50K节点图,每个节点有10个属性。每个节点类型相同但值不同。每个属性都在索引上,我增加了数据库的堆和页面缓存内存大小。但是,使用浏览器控制台,创建节点需要6分钟! 此外,对所有属性的查询需要很长时间(约2分钟)才能显示在浏览器控制台中,但是当结果显示时,浏览器底部会显示50K节点属性的结果仅花费2500毫秒。

如何改进导入/查询数千个唯一实例的性能,单个节点各有10个属性且没有关系?

2 个答案:

答案 0 :(得分:1)

  1. 为您创建的每个节点更新10个不同的索引需要时间。你真的有需要每个属性索引的用例吗?如果没有,请删除不需要的索引。请记住,索引可以加快查找启动查询的第一个节点,但在遍历图表的路径时它们根本没有帮助。

    如果您确实需要所有10个索引,那么为了加快导入步骤,您可以:删除所有索引,导入所有50K节点,然后一次创建一个索引(这将需要一些时间用于每个索引)。整体时间大致相同,但导入本身应该快得多。

  2. neo4j浏览器需要很长时间来生成并显示非常大的结果的可视化(例如,数千个节点中的10个)。浏览器不能同时查看那么多数据。

答案 1 :(得分:0)

1)检查您是否正在运行最新版本的Neo4j。 3+已经优化了属性的存储和索引方式。

2)检查您是如何运行查询的。也许您的查询未经优化或在某种程度上存在问题。请特别注意,每个MATCH都会生成一个“行”。多个MATCH子句将产生所有匹配集的笛卡尔积,这可能会对大量数据造成问题。

3)检查是否需要将每个属性附加到节点。 Neo4j针对搜索关系进行了优化,而不是针对属性进行优化。 考虑转换看起来像这样的节点:

(:Train {
   maxSpeedInKPH: 350,
   fuelType: 'Diesel',
   numberOfEngines: 3
})

(:Train)
-[:USES_FUEL_TYPE]->(:Fuel {type: 'Diesel'}),
-[:HAS_MAX_SPEED]->(:MaxSpeed {value: 350, unit: 'k/h'}),
-[:HAS_ENGINE]->(:Engine),
-[:HAS_ENGINE]->(:Engine),
-[:HAS_ENGINE]->(:Engine)

即使唯一性很低,将属性转化为关系通常也会带来好处。例如,如果您有一个每个节点具有唯一值的属性,通常会将其保留在节点中。但是,如果您的50000节点在该属性中具有较少的25000个唯一值,那么将它们转换为关系可能仍然是有益的。对于整数类型属性,情况绝对如此,您还可以添加其他“存储桶关系”以提供索引形式。在上面的示例中,最大速度为350.将属性转换为关系后,您还可以添加类型[:HAS_MAX_SPEED_ABOVE] - >的其他关系。 300.这会使你的查询复杂化,但应该加快速度。

4)如果以上都不适用于您,无法实现或无法帮助,请考虑切换到更传统的关系数据库,如SQL。 SQL将是您的用例的完美候选者,即50k个不同的节点(行),只有10个不同的属性(列),没有关系(连接)。