0
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

我由近 1,80,000 个名称节点组成,我已经通过更改目标迭代了上述过程以创建超过 100 次的唯一关系。它花费了太多时间。我该如何解决它..

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

4

1 回答 1

2

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

  1. 您绑定图中的所有节点,这通常很慢。
  2. 您将图中的所有节点绑定两次。首先,您在 start 子句中普遍绑定:names=node(*),然后在 match 子句中普遍绑定:MATCH names,然后才限制您的模式。我不太清楚 Cypher 引擎对此有何影响(可能它会偏头痛并去煮一壶咖啡)。这是不必要的,您至少可以删除names=node(*)from start 子句。或者删除 match 子句,我想这也可以,因为您实际上并没有在那里做任何事情,而且只要您使用旧索引,您仍然需要一个 start 子句。
  3. 您使用的是 Neo4j 2.x,但至少在此查询中使用的是旧版索引而不是标签。在不了解您的数据和模型的情况下,很难知道性能有何不同,但它肯定会使编写(和读取)查询变得更加容易。所以,这是一种不同的慢。如果您有标签和标签索引,查询性能可能会提高。

因此,首先尝试删除节点的通用绑定之一,然后使用 2.x模式工具来构建数据。您应该能够编写如下查询

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

但是,我不知道这样的查询对您的数据是否会很快。如果你把“名称”标签放在所有节点上,那么MATCH names:Name仍然会绑定数据库中的所有节点,所以它可能仍然很慢。

PS你创建的关系有一个TYPE被调用contains的,你给他们一个名为的属性typedeclared。也许你有充分的理由,但这可能会让人很困惑。

编辑:
再次阅读您的问题和我的答案,我不再认为我甚至理解您的密码查询。(为什么要返回绑定节点和这些节点的属性?)请考虑在console.neo4j.org上发布示例数据,并更详细地解释您的模型是什么样的以及您正在尝试做什么。如果我的回答完全符合您的问题,请告诉我,否则我会考虑将其删除。

于 2013-10-28T11:02:44.993 回答