2014-01-25 3 views
4

Я запускаю последнюю версию neo4j v2 с установленным пространственным плагином. Мне удалось индексировать почти все узлы, которые мне нужно индексировать в геоинформаторе. Одна из проблем, с которыми я сталкиваюсь, заключается в том, как я могу легко проверить, был ли проиндексирован узел?Как проверить, проиндексирован ли узел в индексе neo4j-пространственных данных?

Я не могу найти никакой конечной точки REST для получения этой информации и нелегко добраться до этого с помощью cypher. Но я попробовал этот запрос, поскольку он, кажется, дает мне результат, который я хочу, за исключением того, что время выполнения неприемлемо.

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

Поскольку индекс гео только сохранить ссылку на узел, который был индексируется в значении свойства идентификатора в узле, на который ссылается отношения RTREE_REFERENCE я полагал, что это может быть путем.

Этот вопрос занят: 14459 ms Пробег от neo4j-shell.

Моя база данных не большая, около 41000 nodes, что я хочу добавить к пространственному индексу в целом.

Должен быть лучший способ сделать это. Любая идея и/или указатель будут очень благодарны.

ответ

0

Прямо сейчас ваши запросы, кажется, просматривают все узлы сети, которые связаны с: RTREE_REFERENCE и проверкой свойства id для каждого из них.

Почему вы не пытаетесь вместо этого начать поиск с нужного идентификатора узла, а затем получить все пути?

Я также не совсем понимаю, почему вам нужно вернуть узел, который вы определяете, но в любом случае.

Как вы работаете Neo4j я рекомендую вам добавить метки к вашим узлам (все они в примере ниже):

START n=node(*) SET n:YOUR_LABEL_NAME 

затем создать индекс на маркированной узле по недвижимости ид.

CREATE INDEX ON :YOUR_LABEL_NAME(id) 

После того, как вы сделали это, выполнить запрос, как это:

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

Это должно увеличить скорость вашего запроса.

Позвольте мне знать, если это работает, и, пожалуйста, объясните, почему вы запрашивая б в исходном вопросе, если вы уже знали это ...

+0

Я тоже не могу это сделать.Может быть, мой вопрос недостаточно ясен. Этот индекс является тем, что генерируется neo4j-пространственным плагином, поэтому я не могу пометить узел, который ссылается на узел, который я индексирую. По крайней мере, насколько я знаю. Я знаю, что прочесывание всей партии - это не выход, и именно поэтому я спрашиваю, есть ли лучший способ сделать это. –

+0

Главное, что делает @deemeetree, заключается в том, что ваш узел будет иметь входящий RTREE_REFERENCE, только если он уже проиндексирован. Из вашего первоначального вопроса я предполагаю, что вы работаете с узлом и должны знать, проиндексирован ли он. Кажется, ваш код пересматривает ваш узел первым, прежде чем проверять входящие отношения. Предложение deemeetree - использовать индекс на этом. Это может работать, но поскольку вы знаете идентификатор своего узла, вам не нужен индекс. См. Мой отдельный ответ для более простого предложения. –

1

Поскольку вы знаете идентификатор вашего узла данных, вы можете получить доступ к нему непосредственно в Cypher без индекса, и просто проверить для входящего RTREE_REFERENCE отношений:

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

в качестве побочного узла, ваш Cypher имел синтаксис «WHERE n.id = 989898», но если это внутренний идентификатор узла, то, что не будет работать, так как n.id будет искать свойство с ключом 'id'. Для внутреннего идентификатора узла используйте 'id (n)'.

Если ваш 'id' на самом деле является свойством node (а не внутренним ID), то я думаю, что предложение @deemeetree лучше, используя индекс над этим свойством.

+0

Это все равно не будет работать, поскольку узел, индексированный в индексе neo4j-space, не имеет прямого соединения. Поэтому в этом случае узел (989898) не имеет прямого отношения r: RTREE_REFERECE. Когда узел добавляется к пространственному индексу, создается новый узел с свойством «id», которое указывает на узел, который я хочу индексировать. Мне кажется, сегодня не существует хорошего способа выполнить эту проверку с помощью cypher. –

Смежные вопросы