在现有节点上创建关系时Neo4j性能问题?

时间:2017-09-11 06:09:38

标签: neo4j

产品索引:

  1. ON:产品(SaleID)
  2. ON:产品(CountryID)
  3. ON:产品(ProductID)
  4. ON:产品(ID)
  5. 几个属性......
  6. 订单索引:

    1. ON:订单(SaleID)
    2. ON:订单(CountryID)
    3. ON:订单(ProductID)
    4. ON:订单(ID)
    5. 几个属性......
    6. 产品有50K节点

      订单有500K节点

      当我在现有节点上创建上述场景的关系时。  社区版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)
      

      目前的conig:

      RAM - 64g heap max = min = 32 页面交换=默认/自动

      数据库命中 - > 5亿次点击

      enter image description here

      Q1。它不考虑索引,如何强制它通过以下索引考虑索引?

      使用Index ON prod:Product(SaleID)

      使用Index ON prod:Product(ProductID)

      使用Index ON prod:Product(CountryID)

      使用Index ON prod:产品(ID)

      Q2。为什么需要这么多时间?任何配置都需要完成? 还是数据模型错了?

1 个答案:

答案 0 :(得分: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

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