Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing Neo4j Cypher 1.9.5查询速度慢,索引超过2个_Indexing_Neo4j_Cypher - Fatal编程技术网

Indexing Neo4j Cypher 1.9.5查询速度慢,索引超过2个

Indexing Neo4j Cypher 1.9.5查询速度慢,索引超过2个,indexing,neo4j,cypher,Indexing,Neo4j,Cypher,我在Neo4j中有一个Cypher 1.9.5查询,当使用三个索引执行时,它只是挂起。如果我将查询更改为使用两个索引和一个where子句,那么它就会工作(仍然很慢!) 在这个修改过的示例中,我正在寻找名称以“tc_”开头的玩具,在名称以“2”开头的小盒子中,在名称以“p”开头的大盒子中 有3个索引挂起 START b=node:BigBox('name:p*'), s=node:SmallBox('name:2*'), ts=node:Toys('name:tc_*') MATCH b-[:SM

我在Neo4j中有一个Cypher 1.9.5查询,当使用三个索引执行时,它只是挂起。如果我将查询更改为使用两个索引和一个where子句,那么它就会工作(仍然很慢!)

在这个修改过的示例中,我正在寻找名称以“tc_”开头的玩具,在名称以“2”开头的小盒子中,在名称以“p”开头的大盒子中

有3个索引挂起

START b=node:BigBox('name:p*'), s=node:SmallBox('name:2*'), ts=node:Toys('name:tc_*')
MATCH b-[:SMALLBOX]->s, s-[:TOYS]->ts
RETURN count(ts)
但这些都起作用了

START s=node:SmallBox('name:2*'), ts=node:Toys('name:tc_*')
MATCH b-[:SMALLBOX]->s, s-[:TOYS]->ts
WHERE b.name =~ '(?i)p.*'
RETURN count(ts)

START b=node:BigBox('name:p*'), ts=node:Toys('name:tc_*')
MATCH b-[:SMALLBOX]->s, s-[:TOYS]->ts
WHERE s.name =~ '(?i)2.*'
RETURN count(ts)
最后两个给出了第一个可能给出的答案


我需要做什么才能在
START
子句中允许两个以上的索引?请注意,我在90-100个小盒子里放了200000多个玩具,这些玩具又放在5个大盒子里。

你犯了一个叫做笛卡尔积的大罪

所发生的事情是,您正在获取索引查找的所有三组结果:
b
s
ts
,对于每个b,它将查找所有的s,对于每一组b+s,它将查找所有的b+s+ts。然后,对于每个组合,它将查找匹配项

解决此问题的更好方法是在start子句中选择最小的集合--
b
,然后使用遍历查找匹配的潜在
s
s和
ts
s。因此:

START b=node:BigBox('name:p*')
MATCH b-[:SMALLBOX]->s
WHERE s.name =~ "2.*" 
WITH b, s
MATCH s-[:TOYS]->ts
WHERE ts.name =~ "tc_.*"
RETURN count(ts)

测试regexp是否快于或慢于:
substring(s.name,0,1)=“2”
Good point,愿意打赌substring快于:)