2012-06-23 4 views
2

В настоящее время я тестирую Neo4j, чтобы узнать, что он может сделать. Моя база данных состоит из около 54000 узлов и 10M отношений (2 типа отношений), которые были импортированы с использованием https://github.com/jexp/batch-import из TSV-файлов. То, что я выясняю, - это необходимость индексов, чтобы получить результаты запроса в разумные сроки.Создание индекса Neo4j по базе данных

Одним из типичных запросов, которые я хочу сделать, является список узлов, которые связаны с определенным типом, а узлы соединения имеют определенные значения. Что-то вроде:

START 
    a=node(*) 
MATCH 
    (a)-[r]->(b) 
WHERE 
    id(a) <> 0 
    AND id(b) <> 0 
    AND type(r) = 'ASSOCIATION' 
    AND a.attr1 = 'value' 
    AND b.attr1 = 'value' 
RETURN 
    a, b LIMIT 200. 

Естественно, этот запрос никогда не завершается.

  1. Имея это в виду, что это самый простой способ (пакетная создать?) Индекс отношения для такого рода запроса на существующей базе данных? И индексы для узлов, которые имеют определенные значения атрибутов?

  2. Это что-то, что можно было сделать с веб-консоли или вообще после этого? Из чтения руководства neo4j я понял, что вы хотите написать пользовательскую реализацию java, которая загружает данные по узлам и создает индексы при создании базы данных. Я лично хотел бы использовать python, но привязки python оказались слишком медленными даже для импорта текущего db.

ответ

1

Вы ищете конкретный старт?

Если нет, то вы можете индексировать ваши отношения, а затем вытащить их в своем начале, а затем идти оттуда:

START 
    specificRelationship=relationship:RelIndex(key='value') 
MATCH 
    a-[specificRelationship]->b 
WHERE 
    AND a.attr1 = 'value' 
    AND b.attr1 = 'value' 
RETURN 
    a, b LIMIT 200 

Чтобы ответить на ваши вопросы:

  1. Вы можете создать любой тип индекса, либо на отношениях, либо на узлах, выбор - это то, что вы собираетесь искать. Обычно я вижу специфику людей в узле сначала, где вы можете получить через пару ключ/значение на основе отдельно определенного свойства.

  2. Я не делал этого на Python, но вы можете легко загрузить его на Java, и если вы хотите выполнить этот запрос, вы можете сделать это через веб-консоль Neo4j или через Java, если хотите что-то делать с информацией.

+0

(2) Взгляд из стороны MySQL, нет ли в gremlin опции для создания индекса для существующих данных? В MySQL вы могли бы просто выполнить команду CREATE INDEX, не так ли? Выглядит громоздким, чтобы перезагрузить весь db каждый раз, когда вам нужен индекс, содержащий большие объемы данных. – amergin

+0

В neo4j вам нужно индексировать себя, это не то, что автоматически делается для вас. – Nicholas

+0

Спасибо! Я немного изменил исходный источник импорта, следуя http://docs.neo4j.org/chunked/stable/batchinsert.html#indexing-batchinsert и создал соответствующие узловые и краевые индексы. Кажется, что можно построить somekind индекса, используя также gremlin (но я не знал, как сделать правильную фильтрацию в гремлине, чтобы получить набор вершин, которые я хочу вместо g.getVertices()): indexKeys = новый HashSet (); indexKeys.add ("attr1"); index = g.createAutomaticIndex ("nodeIndex", Vertex.class, indexKeys); AutomaticIndexHelper.reIndexElements (g, index, g.getVertices()); – amergin

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