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

时间:2013-10-28 07:54:06

标签: neo4j cypher graph-databases

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

Iam由近1,80,000个名称节点组成,我通过更改目标迭代上述过程以创建超过100次的独特关系。它花了太多时间。我怎么解决它..

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

1 个答案:

答案 0 :(得分:2)

我编辑了你的密码查询因为我认为我理解它,但我几乎无法阅读你的其余问题。如果您使用空格和标点符号进行编辑,则可能更容易理解您要执行的操作。在此之前,以下是关于您的查询速度缓慢的一些想法。

  1. 绑定图表中的所有节点,这通常很慢。
  2. 您可以将图表中的所有节点绑定两次。首先,你在start子句中普遍绑定:names=node(*),然后在你的匹配子句中普遍绑定:MATCH names,然后才限制你的模式。我不太清楚Cypher发动机是做什么的(可能是偏头痛,然后去煮一壶咖啡)。这是不必要的,你至少可以从你的起始条款中删除names=node(*)。或者删除match子句,我想这也可以工作,因为你没有真正做任何事情,只要你使用遗留索引,你仍然需要一个start子句。
  3. 您正在使用Neo4j 2.x,但至少在此查询中使用旧版索引而不是标签。在不知道您的数据和模型的情况下,很难知道性能的差异,但它肯定会使编写(和读取)查询变得更加容易。所以,这是一种不同的缓慢。如果你有标签和标签索引,那么查询性能可能会提高。
  4. 因此,首先尝试删除其中一个节点的通用绑定,然后使用2.x schema工具构建数据。您应该能够编写像

    这样的查询
    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
    

    但是,我不知道这样的查询是否会对您的数据造成快速影响。如果在所有节点上放置“Name”标签,那么MATCH names:Name仍将绑定数据库中的所有节点,因此它可能仍然很慢。

    P.S。您创建的关系有一个名为TYPE的{​​{1}},您为其提供了一个名为contains的属性,其值为type。也许你有充分的理由,但这可能非常令人困惑。

    修改
    再次阅读你的问题和我的答案,我不再认为我理解你的密码查询。 (为什么要返回这些节点的绑定节点和属性?)请考虑在console.neo4j.org上发布样本数据,并更详细地解释您的模型是什么样的以及您要做什么。如果我的回答完全符合您的问题或者我会考虑删除它,请告诉我。