为什么Neo4j浏览器中的适度匹配和创建查询会旋转? 概述

为什么Neo4j浏览器中的适度匹配和创建查询会旋转? 概述,neo4j,cypher,Neo4j,Cypher,我正在使用Neo4j桌面浏览器在网站内创建页面关系图。我相信csv加载可以提高效率,但这个查询似乎不会像它那样引起很多问题 创建节点的时间比预期的长(语法首选项?) 关系创建旋转和超时/崩溃 问题1 创建节点的时间比预期的长(语法首选项?) 我正在创建大约6500个非常基本的节点(每个节点中有一条信息): create(a1:link{description:“www.samplelink.com/example1”}) 我正在Excel中生成查询,并将其复制粘贴到neo4j浏览器中。我可以通

我正在使用Neo4j桌面浏览器在网站内创建页面关系图。我相信csv加载可以提高效率,但这个查询似乎不会像它那样引起很多问题

  • 创建节点的时间比预期的长(语法首选项?)
  • 关系创建旋转和超时/崩溃
  • 问题1 创建节点的时间比预期的长(语法首选项?) 我正在创建大约6500个非常基本的节点(每个节点中有一条信息):

    create(a1:link{description:“www.samplelink.com/example1”})

    我正在Excel中生成查询,并将其复制粘贴到neo4j浏览器中。我可以通过以下两种方式之一构建它:

    create (a1:link {description:"www.samplelink.com/example1"})
    create (a2:link {description:"www.samplelink.com/example2"})
    create (a3:link {description:"www.samplelink.com/example3"})
    ...x6,000
    

    Q:是否有首选语法?每个人的优势是什么? 6500个节点(尤其是没有大量信息的基本节点)似乎不会有很大的性能改进。查询需要5分钟到15分钟以上的时间,程序规定的实际运行时间为7000毫秒或47000毫秒。但实际的浏览器旋转比规定的最终运行时间要长得多

    问题2 关系创建旋转和超时/崩溃 我构造(我解释的是)非常简单的匹配子句来分配昵称。字符串匹配是文本的(没有regexp),没有图遍历,关系也很简单

    match (a1:link {description:"www.samplelink.com/example1"})
    match (a2:link {description:"www.samplelink.com/example2"})
    match (a3:link {description:"www.samplelink.com/example3"})
    ...x6,000
    
    create (a1)-[:REF]->(a3)
    create (a1)-[:REF]->(a47)
    create (a5832)-[:REF]->(a9)
    ...x5,000
    
    此查询运行2个多小时,然后崩溃/超时

    Q:语法方面,我是不是做了一些非常需要内存的事情?这应该用稍微不同的方式写吗?一个带逗号的匹配短语?为关系创建一个短语?

    我的阅读材料 1。我考虑了这篇关于基数的文章:

    似乎我无意中创造了一个巨大的关系交叉产品,而不是每一个单一的关系的意图。。。?我也不知道匹配语法是否对neo4j输出“行”的方式做了一些有趣的事情,将这些行保存在内存中,然后对每一行执行所需的操作

    在一个匹配短语内进行匹配是否更有效?与“创建关系”相同

    MATCH (a1:link {desc:"alpha"}),
    (a2:link {desc:"beta"}),
    (a3:link {desc:"gamma"})
    
    2。索引

    我看到很多地方有人评论其他旋转查询帖子,以创建索引

    我确实尝试在:link(description)上创建一个索引
    create index,但是来自SQL背景,我不明白这将如何在只有6500个文本字符串匹配的情况下大大加快查询速度

    3。类似的挂起问题

    经批准的答案,第三点,建议将其拆分为每个匹配/创建100个较小的事务。我想我能做到?在Excel中,为了确保my MATCH子句包含用于创建部分的适当节点,似乎需要做很多修改。似乎neo4j应该能够在内存中处理6500个节点和5000个基本关系……我在这里不做任何高级工作

    更新 我现在正在以“匹配节点,节点,节点”格式而不是“匹配节点匹配节点”格式重新运行查询。我只有一个CREATE语句,两个节点之间的随机关系。这个(显然是大量的)带有单个CREATE子句的MATCH子句需要15分钟以上的时间。所以我认为这是一个在内存中保存所有节点的问题,这就是问题所在

    查询以错误结束:“Neo.TransientError.General.StackOverflowerError-堆栈大小不足,无法执行当前任务。这通常被认为是数据库错误,因此请联系Neo4j支持。您可以尝试增加堆栈大小:例如,要将堆栈大小设置为2M,请在neo4j配置中添加`dbms.jvm.additional=-Xss2M'(通常在'conf/neo4j.conf'中,或者如果您使用的是neo4j桌面,则通过用户界面找到),或者如果您正在运行嵌入式安装,则只需添加-Xss2M作为命令行标志。”


    我构建了非常基本的MATCH node1 MATCH node2 CREATE(node1)-[:REL]->(node2);并将这些查询串在一起。每个小查询连续运行,但在我的Neo4j浏览器中,每个查询实际需要2秒(在30秒的预热后处理/编译初始查询).300查询以这种速度需要10分钟。我有5000条语句要处理。当人们创建具有数千/百万/数十亿个节点的图形时,必须有一种更有效的方法。它是否简单到“不使用Neo4j浏览器?”并使用csv加载?

    而不是将数据预处理为密码格式,如:

    match (a1:link {description:"www.samplelink.com/example1"})
    match (a2:link {description:"www.samplelink.com/example2"})
    match (a3:link {description:"www.samplelink.com/example3"})
    ...x6,000
    
    create (a1)-[:REF]->(a3)
    create (a1)-[:REF]->(a47)
    create (a5832)-[:REF]->(a9)
    ...x5,000
    
    您希望将数据预处理为CSV文件,例如:

    link_from, link_to
    samplelink1,samplelink2
    
    然后使用
    LOAD CSV
    语句导入数据:

    LOAD CSV WITH HEADER FROM "file:///yourfile.csv" as row
    MERGE (from:link{description:row.link_from})
    MERGE (to:link{description:row.link_to})
    MERGE (from)-[:REF]->(to)
    

    有了正确的索引设置,导入应该需要几秒钟的时间。

    问题1:您应该将a中所有
    描述
    值的列表传递给查询。查询可以使用
    展开
    从该列表中获取元素。查询将非常小,执行速度更快(同时还要避免密码注射攻击)

    例如(如果列表以
    说明
    参数传递):

    您可能想将非常大的列表分成更小的块,但6500不是很大

    问题2:您可以使用@TomažBratanič的方法,也可以使用类似于我对问题1的方法。也就是说,您可以向查询传递一组
    描述

    例如,如果
    descriptionPairs
    参数的每个元素都是2个
    description
    值的列表:

    UNWIND $descriptionPairs AS descPair
    MATCH (a1:link {description: descPair[0]})
    MATCH (a2:link {description: descPair[1]})
    CREATE (a1)-[:REF]->(a2)
    
    而且,要使此查询真正快速,还应该在
    :link(description)
    上创建一个

    注意:如果要避免创建重复的节点或关系,应使用而不是
    CREATE
    f
    UNWIND $descriptions AS desc
    CREATE (a1:link {description: desc})
    
    UNWIND $descriptionPairs AS descPair
    MATCH (a1:link {description: descPair[0]})
    MATCH (a2:link {description: descPair[1]})
    CREATE (a1)-[:REF]->(a2)