我们正在开发一个基于neo4j和php的应用程序,其中包含大约200 k节点,每个节点都有一个属性(如type='user'或type='company' )来表示应用程序的特定实体。我们需要得到图中特定类型的所有节点的计数。
我们为每个实体创建了一个索引,比如保存该属性节点的users,companies。因此,在users索引中驻留130 K节点,其余位于companies上。
有了塞弗,我们就这样犹豫了。
START u=node:users('id:*')
RETURN count(u)结果是
Returned 1 row.Query took 4080ms服务器被配置为默认配置,只需稍作调整,但4秒也不能满足我们的需要。考虑到数据库将在一个月内增长到20K,所以我们非常需要这个查询。
还有其他方法可以做到这一点吗?也许是用Gremlin,还是用其他服务器插件?我将缓存这些结果,但我想知道是否可以修改这些结果。
非常感谢,为我糟糕的英语感到难过。
发布于 2012-10-24 03:41:48
最后,用Gremlin而不是Cypher,我找到了解决方案。
g.getRawGraph().index().forNodes('NAME_OF_USERS_INDEX').query(
new org.neo4j.index.lucene.QueryContext('*')
).size()此方法使用lucene索引获取“接近”行。
再次感谢大家。
发布于 2012-08-02 17:27:56
嗯,这真的是关于Lucene指数的表现。如果您大部分时间只需要这个查询,那么为什么不更新一个整数,在某个节点上使用总计数,并可能将其与索引插入一起更新,以便更好地使用每晚以上的查询运行更新?
发布于 2013-07-03 10:32:37
如果希望获得最佳性能,请不要将实体类别建模为节点上的属性。相反,你要这样做:
公司1-:IS_ENTITY->公司实体
或者如果您正在使用2.0
公司1:公司
第二个功能还允许您在一个单独的后台线程中自动更新索引,顺便说一句,imo是2.0最好的新特性之一
第一种方法还应该证明效率更高,因为与从节点读取属性相比,创建一个“跃点”通常花费更少的时间。但是,它确实要求您为实体创建单独的索引。
您的查询如下所示:
v2.0
MATCH company:COMPANY
RETURN count(company)v1.9
START entity=node:entityindex(value='company')
MATCH company-[:IS_ENTITIY]->entity
RETURN count(company)https://stackoverflow.com/questions/11782197
复制相似问题