Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Multithreading 服务器插件查询的Neo4j优化问题_Multithreading_Performance_Caching_Cypher_Neo4j - Fatal编程技术网

Multithreading 服务器插件查询的Neo4j优化问题

Multithreading 服务器插件查询的Neo4j优化问题,multithreading,performance,caching,cypher,neo4j,Multithreading,Performance,Caching,Cypher,Neo4j,我正在尝试优化模糊搜索查询。它相当大,因为它在数据库中的大多数属性中搜索单个单词。我有一些问题,关于我一直在做的一些事情,以提高搜索速度 测试信息:我添加了大约10000个节点,正在搜索大约40个属性。根据条件,我的查询时间大约为3-30秒 MATCH (n) WHERE (n:Type__Exercise and ( n.description =~ '(?i).*criteria.*' or n.name =~ '(?i).*criteria.*' )) or (n:Type_

我正在尝试优化模糊搜索查询。它相当大,因为它在数据库中的大多数属性中搜索单个单词。我有一些问题,关于我一直在做的一些事情,以提高搜索速度

测试信息:我添加了大约10000个节点,正在搜索大约40个属性。根据条件,我的查询时间大约为3-30秒

MATCH (n) WHERE 
(n:Type__Exercise and ( n.description =~ '(?i).*criteria.*'  or  n.name =~ '(?i).*criteria.*'  ))  or  
(n:Type__Fault and ( n.description =~ '(?i).*criteria.*'  or  n.name =~ '(?i).*criteria.*'  ))

with n LIMIT 100
return count(n)
这基本上是我的查询,但是有很多OR子句。在将查询发送到执行引擎时,我也使用参数。我意识到在每个属性上使用正则表达式是非常昂贵的。我希望我可以在不进行精确匹配的情况下获得足够好的性能,最多可以匹配一定数量的数据(此应用程序一次只能有1-10个用户查询)在新标签索引支持全文查询之前,这可能是我们正在调查的一项临时工作。

首先,如何判断我的查询是否缓存?我通过curl命令调用我的服务器插件,每次通过相同的条件时,我看到的时间几乎相同(时间是整个curl命令完成的时间)。我使用的是执行引擎的一个实例,它是使用GraphDatabaseService创建的,GraphDatabaseService通过@Source参数传递给插件如果缓存查询,我应该看到多大的改进?

是否存在一个查询大小,Neo4j不需要缓存查询?

LIMIT子句在加快查询速度方面有多有效?我添加了一个,但没有看到性能有很大提高(对于有结果的查询)。执行引擎找到足够的节点后是否停止

我的查询只准备好了,我还需要用事务来包装我的通话吗?

我可以拆分查询,以便一次只搜索一个属性,或者说一次搜索4个属性。然后我可以通过执行引擎运行整个查询集。这似乎更适合缓存,但运行多个小查询而不是一个大查询是否会增加成本?如果我启动了10个线程怎么办?是否有足够的性能提升使其值得一试?

在Neo4j控制台中使用PROFILE时,有没有一种方法可以使用参数?我一直在尝试使用它来查看我在查询中获得了多少db命中率

Neo4j浏览器在比较执行查询所需时间方面的效果如何? 缓存发生在这里吗


如果我想为查询预热Neo4j数据,我可以运行我期望的精确查询吗?查询是否需要返回数据,或者计数类型查询是否会使缓存升温?作为替代方案,我应该迭代所有节点吗?我宁愿只搜索可能被搜索的节点,而不是所有的节点。

我认为目前最好使用全文旧式索引设施,我最近写了一篇关于它的博客文章:

如果您不想这样做:

我可能还会重写您的查询以扭转局面:

MATCH (n) 
WHERE 
   (n:Type__Exercise OR n:Type__Fault) AND 
   (n.description =~ '(?i).*criteria.*'  OR  n.name =~ '(?i).*criteria.*'  )
您还可以通过使用第二个“搜索”字段获得更多好处,该字段只是
说明
名称
字段的串联。您可能还想改进您的regexp,比如添加单词边界
\b
左右

关于你的问题:

首先,如何判断我的查询是否已缓存? 如果使用参数(对于regexp),查询将被缓存。有一个可配置的查询缓存大小(默认为100个查询)

是否有一个查询大小,Neo4j不需要缓存查询? Neo4j当前缓存所有传入的查询,无论大小

我的查询只准备好了,我还需要用事务包装我的呼叫吗? Cypher将创建自己的事务。通常,读取事务是必需的。对于cypher,如果希望多个查询参与同一tx范围,则需要外部事务

运行多个小查询而不是一个大查询是否会增加成本?如果我踢出10个线程呢?是否会有足够的性能提升来让这段时间变得值得? 这取决于较小的查询执行得更快(如果它们涉及的数据集较少),但您必须在客户端合并它们的结果

如果它们接触到相同的节点,则执行双重工作

对于更大的查询,当跨积或指数路径爆炸时,您必须小心

关于使用多个线程运行较小的查询 好问题,应该更快。目前,我们将要消除一些瓶颈。试试看

在Neo4j控制台中使用配置文件时,是否有使用参数的方法? 您可以使用shell变量,使用
export name=value
并使用
env

e、 g

Neo4j浏览器在比较执行查询所需时间方面的效果如何? 浏览器测量可能有更多数据加载的完整往返,因此它的计时不是很准确

热身 确切的问题是有意义的
您不必返回数据,
返回计数(*)
就足够了,但您应该访问要访问的属性以确保它们已加载。

我的查询似乎没有被缓存。我多次使用相同的查询启动服务器插件,它运行的秒数相同。可能有一个我没有看到的小差异,但是如果我的查询需要20秒,我觉得如果缓存查询,应该至少会减少一秒的执行时间。这就是为什么我想知道缓存性能的预期提高。目前,我确实试图避免使用遗留索引,但是
export name=Lisa

profile match (n:User {name:{name}}) return n;