0

我有一个 Cypher 查询,它的性能极差(约 30 秒):

START foo=node:foos('Name:*')
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE foo.Name IN ["name1", "name2"] AND bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name

我认为正在发生的事情是 Lucene 索引用于提取所有值,然后使用图形搜索来匹配集合中的名称,因为如果我将查询更改为下面的查询,则速度会快几个数量级(16 毫秒):

START foo=node:foos('Name:"name1" OR Name:"name2"')
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name

有没有办法让第一个查询与第二个查询一样快地执行,而无需从名称集中手动构建一个 Lucene 查询?

另一种选择是使用遍历,但如果可能的话,我更喜欢留在 Cypher-land。

4

1 回答 1

3

也许如果您不想构建查询,请尝试更早进行过滤?像

START foo=node:foos('Name:*')
WHERE foo.Name IN ["name1", "name2"]
WITH foo
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name
于 2013-03-12T09:36:34.117 回答