我编辑了您的密码查询,因为我认为我理解它,但我几乎无法阅读您的其余问题。如果您使用空格和标点符号对其进行编辑,则可能更容易理解您要执行的操作。在此之前,这里有一些关于您的查询速度慢的想法。
- 您绑定图中的所有节点,这通常很慢。
- 您将图中的所有节点绑定两次。首先,您在 start 子句中普遍绑定:
names=node(*)
,然后在 match 子句中普遍绑定:MATCH names
,然后才限制您的模式。我不太清楚 Cypher 引擎对此有何影响(可能它会偏头痛并去煮一壶咖啡)。这是不必要的,您至少可以删除names=node(*)
from start 子句。或者删除 match 子句,我想这也可以,因为您实际上并没有在那里做任何事情,而且只要您使用旧索引,您仍然需要一个 start 子句。
- 您使用的是 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
的,你给他们一个名为的属性type
值declared
。也许你有充分的理由,但这可能会让人很困惑。
编辑:
再次阅读您的问题和我的答案,我不再认为我甚至理解您的密码查询。(为什么要返回绑定节点和这些节点的属性?)请考虑在console.neo4j.org上发布示例数据,并更详细地解释您的模型是什么样的以及您正在尝试做什么。如果我的回答完全符合您的问题,请告诉我,否则我会考虑将其删除。