4

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

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

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

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

此查询现在需要:14459 msneo4j-shell.

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

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

4

2 回答 2

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,使用“id(n)”。

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

于 2014-02-21T12:56:47.633 回答
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...

于 2014-02-13T12:11:30.890 回答