Neo4j 创建独特的关系需要花费大量时间

Neo4j 创建独特的关系需要花费大量时间,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,Iam由近18000个名称节点组成,我通过改变目标,重复了上述过程,创建了100次以上的唯一关系。这件事花了太多时间。我该怎么解决呢 我用java和iterated.iam构建查询,使用neo4j 2.0.0.5和java 1.7。我编辑了您的cypher查询,因为我想我理解它,但我几乎看不懂您问题的其余部分。如果你用空格和标点符号编辑它,你可能更容易理解你想做什么。在此之前,以下是关于您的查询速度缓慢的一些想法 绑定图中的所有节点,这通常非常慢 将图中的所有节点绑定两次。首先在start子句中

Iam由近18000个名称节点组成,我通过改变目标,重复了上述过程,创建了100次以上的唯一关系。这件事花了太多时间。我该怎么解决呢


我用java和iterated.iam构建查询,使用neo4j 2.0.0.5和java 1.7。

我编辑了您的cypher查询,因为我想我理解它,但我几乎看不懂您问题的其余部分。如果你用空格和标点符号编辑它,你可能更容易理解你想做什么。在此之前,以下是关于您的查询速度缓慢的一些想法

  • 绑定图中的所有节点,这通常非常慢
  • 将图中的所有节点绑定两次。首先在start子句中全局绑定:
    names=node(*)
    ,然后在match子句中全局绑定:
    match names
    ,然后才限制模式。我不太清楚Cypher引擎是怎么做的(可能它会偏头痛,然后去煮一壶咖啡)。这是不必要的,至少可以从start子句中删除
    names=node(*)
    。或者删除match子句,我想这也行得通,因为在那里你什么都不做,而且只要你使用遗留索引,你仍然需要一个start子句
  • 您使用的是Neo4j 2.x,但您使用的是传统索引而不是标签,至少在这个查询中是这样。在不了解数据和模型的情况下,很难知道性能会有什么不同,但这肯定会使编写(和读取)查询变得更容易。所以,这是另一种缓慢。如果有标签和标签索引,查询性能可能会提高
  • 因此,首先尝试删除节点的一个通用绑定,然后使用2.x工具构建数据结构。您应该能够编写如下查询

    START names = node(*),
      target=node:node_auto_index(target_name="TARGET_1")
    MATCH names 
    WHERE NOT names-[:contains]->() 
      AND HAS (names.age)
      AND (names.qualification =~ ".*(?i)B.TECH.*$" 
        OR names.qualification =~ ".*(?i)B.E.*$") 
    CREATE UNIQUE (names)-[r:contains{type:"declared"}]->(target)
    RETURN names.name,names,names.qualification
    
    然而,我不知道这样的查询是否能快速查询到您的数据。如果将“名称”标签放在所有节点上,则
    匹配名称:Name
    仍将绑定数据库中的所有节点,因此速度可能仍然较慢

    另外,您创建的关系有一个名为
    contains
    类型
    ,您给它们一个名为
    类型
    的属性,该属性的值声明为
    。也许你有一个很好的理由,但这可能会让人很困惑

    编辑:

    再读一遍你的问题和我的答案,我认为我甚至不理解你的密码查询。(为什么返回这些节点的绑定节点和属性?)请考虑发布示例数据并更详细地解释模型的外观和所做的工作。如果我的答案完全符合你的问题,或者我会考虑删除它。

    我是NeN4J的初学者,我对索引和标签有点迷惑。你的答案很好。在阅读了你的答案后,我对索引有了一个问题,我引用了NeN4J的索引链接。我已经用csv导入器导入了节点和关系,如何给它们建立索引。。
    MATCH target:Target
    WHERE target.target_name="TARGET_1"
    WITH target
    MATCH names:Name
    WHERE NOT names-[:contains]->() 
      AND HAS (names.age)
      AND (names.qualification =~ ".*(?i)B.TECH.*$" 
        OR names.qualification =~ ".*(?i)B.E.*$") 
    CREATE UNIQUE (names)-[r:contains{type:"declared"}]->(target)
    RETURN names.name,names,names.qualification