Neo4j按范围表现匹配

时间:2015-12-16 12:26:17

标签: performance neo4j cypher

我有以下设置:

大约1,5m个IpRangeBlock类型的节点由startend属性组成 - 它们都是Long类型。有start属性的索引。

然后我要做的是找到包含给定IP的范围。所以,例如for ip 0.0.0.2我将其转换为long,然后在所有节点n.start <= 2 && n.end >= 2上执行比较。

我运行的密码查询如下所示:

MATCH (n:IpRangeBlock) WHERE n.start <= {ip} AND n.end >= {ip} RETURN n LIMIT 1

一切都很好,但正如我所提到的,对于1,5m节点,我可以花20秒钟让Neo4j找到匹配的范围。我的问题是,有没有办法加快这个操作或我的数据库设计的错误?

1 个答案:

答案 0 :(得分:1)

好的,我尝试缓存节点引用并在app端执行比较。正如您所料 - 拉动大量节点需要时间。

所以我尝试了另一种方法 - 我检查了我们的数据集,结果发现所有ip范围都是&#39; java.lang.RuntimeException: Unable to start activity ComponentInfo{example.android.webdroid.loginapplication/example.android.webdroid.loginapplication.Home}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 12-29 21:25:48.640 24076-24076/example.android.webdroid.loginapplication E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2390 start属性以相同的第一个八位字节开头。我使用这些八位字节作为分组节点来快速缩小可能的IP范围的子集。这很有效,因为我们的数据集实际上分布在所有IP范围内。现在,而不是比较100k节点&#39;属性,每个查询必须这样做只有&#39;约8-10k。

我知道这不是完美的方法,但它对我有用。 There's neo4j article我从中得到了这个想法。