如何检查节点是否已经在neo4j-spatial索引中编入索引?

时间:2014-01-25 01:39:39

标签: neo4j-spatial

我正在运行最新的neo4j v2,并安装了空间插件。我已经设法索引几乎所有我需要在地理索引中编入索引的节点。我正在努力解决的一个问题是如何轻松检查节点是否已被索引?

我找不到任何REST端点来获取此信息,并且使用cypher不容易实现此目的。但我尝试了这个查询,因为它似乎给了我想要的结果,除了运行时是不可接受的。

MATCH (a)-[:RTREE_REFERENCE]->(b) where b.id=989898 return b;

由于geo索引只存储对已在关系RTREE_REFERENCE引用的节点中的id属性值中编入索引的节点的引用,我认为这可能是要走的路。

此查询现在需要:14459 msneo4j-shell运行。

我的数据库并不大,大约是41000 nodes,我想要添加到空间索引中。

必须有更好的方法来做到这一点。任何想法和/或指针将不胜感激。

2 个答案:

答案 0 :(得分:1)

由于您知道数据节点的ID,因此可以在没有索引的情况下直接在Cypher中访问它,只需检查传入的RTREE_REFERENCE关系:

START n=node(989898) MATCH (p)-[r:RTREE_REFERENCE]->(n) RETURN r;

作为一个侧节点,您的Cypher的语法为'WHERE n.id = 989898'但如果这是一个内部节点ID,那么这将无效,因为n.id将查找一个键为'id'的属性。对于内部节点标识,请使用“id(n)”。

如果你的'id'实际上是一个节点属性(而不是它的内部ID),那么我认为@deemeetree建议更好,使用此属性的索引。

答案 1 :(得分:0)

现在,您的请求似乎正在搜索网络中与RTREE_REFERENCE相关的所有节点,并检查每个节点的id属性。

为什么不尝试从您需要的节点ID开始搜索,然后获取所有类似的路径?

我也不太明白为什么你需要返回你正在定义的节点,但无论如何。

当您运行Neo4J时,我建议您为节点添加标签(以下示例中的所有标签):

START n=node(*) SET n:YOUR_LABEL_NAME

然后通过id属性在标记的节点上创建索引。

CREATE INDEX ON :YOUR_LABEL_NAME(id)

完成后,运行如下查询:

MATCH (b:YOUR_LABEL_NAME{id:"989898"}), a-[:RTREE_REFERENCE]->b RETURN a,b;

这应该可以提高查询速度。

如果有效,请告诉我,如果您已经知道,请解释为什么您在原始问题中查询b ...