首页 文章

Neo4j - Cypher Build 关系的声明花了将近一半的时间来完成错误“不允许自我抑制”

提问于
浏览
1

通常我在从CSV文件加载时构建节点之间的关系 . 这是一个写cypher的语句,我这次用它来 Build 节点之间的关系 . 语言节点为39K,描述节点为2M .

MATCH (d:Description),(l:Language)
> WHERE d.description_language = l.language_name
> CREATE (d)-[r:HAS_LANGUAGE]->(l);

经过一段时间,运行我得到的错误是:

Self-suppression not permitted

我已经为关系中使用的属性创建了索引 .

Indexes
... 
  ON :Description(woka_id)              ONLINE                             
  ON :Description(description_language) ONLINE                             
  ON :Language(language_id)             ONLINE (for uniqueness constraint) 
  ON :Language(language_name)           ONLINE (for uniqueness constraint) 
...

我在这里做错了导致这么长时间来完成关系创建(超过10个小时)?

2 回答

  • 2

    由于您要从每个描述节点创建关系,并且有2M的关系,我只需抓取尚未匹配的描述并以较小的批次执行 .

    就像是...

    match (d:Description)
    where not ( d-[:HAS_LANGUAGE]->() )
    with d
    limit 200000
    match (l:Language {language_name: d.description_language} )
    create d-[:HAS_LANGUAGE]->l
    
  • 1

    您正在过滤步骤处理非常大的笛卡尔积:

    WHERE d.description_language = l.language_name
    

    您可以尝试 MATCH Descriptions ,将它们与 description_languageCREATE 组合起来:

    MATCH (d:Description)
    WITH d.description_language AS dl, collect(d) as all_d_for_lang
    MATCH (l:Language {language_name: dl})
    UNWIND all_d_for_lang AS d
    CREATE (l)-[:HAS_LANGUAGE]->(d)
    

    如果查看此查询的 PROFILE ,您会看到DB命中数较少(限制第一个 MATCH 中的描述数量以进行测试) .

    一般来说,我认为最好的方法是在创建节点时使用CSV文件生成关系,即执行此应用程序端,而不是数据库 .

相关问题