2014-01-25 177 views
4

我正在運行最新的neo4j v2,並安裝了空間插件。我設法爲地理索引中需要索引的幾乎所有節點建立索引。我正在努力解決的問題之一是如何輕鬆檢查節點是否已被編入索引?如何檢查節點是否已經在neo4j-spatial索引中編入索引?

我無法找到任何REST端點來獲取此信息,並且不容易通過密碼獲得此信息。但我試過這個查詢,因爲它似乎給我我想要的結果,除了運行時是不可接受的。

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

由於地理指數僅存儲已經在由關係RTREE_REFERENCE引用的節點ID的屬性值被索引節點的引用我想這可能是要走的路。

此查詢現在需要:14459 ms運行從neo4j-shell

我的數據庫並不大,大概是41000 nodes,我想把它加到空間索引中。

必須有更好的方法來做到這一點。任何想法和或指針將不勝感激。

回答

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如果您已經知道了吧...

+0

我真的不能這樣做。也許我的問題還不夠清楚。該索引是由neo4j-spatial插件生成的,因此我無法標記引用正在索引的節點的節點。至少據我所知。我知道,通過全部搜索並不是要走的路,這就是爲什麼我問是否有更好的方法來做到這一點。 –

+0

@deemeetree的主要觀點是,只有已經建立索引的節點纔會有傳入的RTREE_REFERENCE。從你原來的問題,我假設你正在與一個節點工作,並需要知道它是否索引。在檢查傳入關係之前,您的代碼似乎是先重新搜索您的節點。 deemeetree的建議是使用一個索引。這可以工作,但由於您知道節點的ID,因此不需要索引。請參閱我的單獨答案以獲得更簡單的建議。 –

1

既然你知道你的數據節點的ID,就可以直接訪問它暗號沒有索引,只是檢查傳入RTREE_REFERENCE關係:

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

作爲一個側節點,你的暗號有語法「WHERE n.id = 989898」,但是,如果這是一個內部節點ID,則該將不起作用,因爲n.id將查找具有'id'鍵的屬性。對於內部節點ID,請使用'id(n)'。

如果你的'id'實際上是一個節點屬性(而不是它的內部ID),那麼我認爲@deemeetree建議更好,在這個屬性上使用索引。

+0

這仍然不會工作,因爲在neo4j-spatial索引中建立索引的節點沒有直接連接。所以在這種情況下,節點(989898)與r:RTREE_REFERECE沒有直接關係。當一個節點被添加到空間索引中時,將創建一個新的節點,並帶有一個「id」屬性,該屬性指向我要索引的節點。在我看來,今天不存在一種用密碼進行這種檢查的好方法。 –

相關問題