我有以下设置:
大约1,5m个IpRangeBlock
类型的节点由start
和end
属性组成 - 它们都是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找到匹配的范围。我的问题是,有没有办法加快这个操作或我的数据库设计的错误?
答案 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我从中得到了这个想法。