【问题标题】:Neo4j Performance Issue while creating relationship on existing nodes?在现有节点上创建关系时出现 Neo4j 性能问题?
【发布时间】:2017-09-12 01:40:37
【问题描述】:

产品索引:

  1. 开启:产品(SaleID)
  2. 开启:产品(国家 ID)
  3. 开启:产品(ProductID)
  4. 开启:产品 (ID)
  5. 更多属性...

订单索引:

  1. 开启:订单(SaleID)
  2. 开启:订单(国家 ID)
  3. 开启:订单(ProductID)
  4. 开启:订单 (ID)
  5. 更多属性...

产品有 50K 个节点

Orders 有 50 万个节点

当我在现有节点上的上述场景中创建关系时。 在社区版本 3.1 中需要 15 分钟。

查询:

MATCH(prod:Products) 
WHERE prod.ID = 999 
WITH prod 
MATCH (ord:Orders) 
WHERE ord.ID = prod.ID and ord.SaleID=prod.SaleID and ord.CountryID  = prod.CountryID and ord.ProductID = prod.ProductID 
CREATE (prod)-[prod_ord]->(ord)

当前配置:

内存 - 64g 堆最大值 = 最小值 = 32 页面交换 = 默认/自动

DB 命中 -> 5 亿次命中

enter image description here

第一季度。它不考虑索引,我如何强制它考虑通过以下索引进行索引?

在 prod:Product(SaleID) 上使用索引

在 prod:Product(ProductID) 上使用索引

在 prod:Product(CountryID) 上使用索引

在 prod:Product(ID) 上使用索引

第二季度。为什么要花这么多时间?需要做任何配置吗? 还是数据模型错了?

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    您的查询使用Products 标签,但您的索引位于Product

    还提取产品 id 作为参数并在第二次匹配中使用它。然后它应该使用Orders(ID) 索引:

    MATCH (prod:Products) 
    WHERE prod.ID = {prodId} 
    WITH prod 
    MATCH (ord:Orders) 
    WHERE ord.ID = {prodId} and ord.SaleID=prod.SaleID and ord.CountryID  = prod.CountryID and ord.ProductID = prod.ProductID 
    CREATE (prod)-[prod_ord]->(ord)
    

    您可以在浏览器中设置参数

    :param prodId : 999
    

    其他索引可能不是很有用,因为通常查找一个属性然后过滤结果比使用多个查找和执行某种连接要快。如果某些属性更独特,请改用它。

    【讨论】:

    • 1.该索引仅在产品上...这里有拼写错误。我现在已经更正了。 2. 通过桌面客户端应用程序创建关系。因此,prodID 是动态分配的。每次从客户端触发时都会创建关系。你能帮我解决这里的性能问题吗?
    • 我们可以强制查询“使用索引”吗?
    • @neoman1 你可以尝试交换匹配子句,这样可以减少需要过滤的行数。
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多