2015-03-30 6 views
2

Согласно новым правилам индексирования, auto_index уйдет в будущем и ожидается, что он будет создавать индексы с использованием cypher. В соответствии с этим новым способом, чтобы индексировать свойство узла, вы ДОЛЖНЫ предоставить метку узла.Общее шифрование cypher для всех узлов

У меня есть свойство «NodeId» присутствует на всех типах узлов Labels - Пользователь, сотрудник банка, автомобилей и т.д. я использовал для автоматического индексирования этого свойства, чтобы получить какой-либо тип узла, если его NodeId известно , Обратите внимание, что поскольку автоиндекс не требовал, чтобы я дал метку узла, мне удалось сделать то, что я сделал.

ReadableIndex<Node> readableIndex = this.graphDatabaseService.index().getNodeAutoIndexer().getAutoIndex(); 
readableIndex.get("nodeId", "0").getSingle(); 

Но с новым стилем я должен создать индекс на свойстве nodeId для каждой метки узла. Так что я должен сделать это:

create index on :User(nodeId) 
create index on :Employee(nodeId) 
... 

Кроме того, мой метод getByNodeId(String nodeId) теперь бесполезно, потому что это ничтожество ИМХО запрос не сможет больше использовать индекс, так как я не проходит какой-либо метки узла.

match (node) where node.nodeId = {nodeId} return node; 

Поскольку вся суть моего метода getByNodeId() должен был быть общим для всех узлов, я не могу дать этому Cypher-запрос метки узла. Так что я должен делать здесь. Мой 2 вопроса:

  • Как сказать Neo4j через шифр индексировать на все узлы этикетки
  • Как я пишу Cypher запрос, который использует индекс не основан на этикетке узла, но основанный на собственности узла.

Примечание:

  • Это очень важно для меня, чтобы использовать шифр, потому что я использую Neo4j-JDBC и они не имеют никакого способа для создания авто-индекса или получить доступ к авто-индексатора (по крайней мере, этого я не знаю).

  • Некоторые могут предложить мне изменить neo4j.properties, чтобы включить автоиндексирование, но мне не нравятся изменения файлов конфигурации. I хочу сделать это в моей программе. Во всяком случае, это только разрешило бы первый выпуск . Второй вопрос все еще существует.

+0

Спасибо для этого! Я собирался спросить то же самое. – ADTC

ответ

3

Узел может иметь несколько меток.

Таким образом, если вы сделаете все ваши узлы имеют общую метку, скажем Base (в дополнение к любым лейблы они в настоящее время), вы можете просто иметь один индекс, который охватывает все узлы:

CREATE INDEX ON :Base(nodeId) 
+0

Это, безусловно, хороший ответ. Однако нет другого пути? Вот почему - у меня есть три разных варианта базы данных - neo4j embedded и rest, и titan. Я хочу, чтобы все они имели одну и ту же структуру графика, потому что это помогло мне упростить процесс. Я бы не хотел отклоняться от согласованности трех баз данных, пока мне действительно не нужно. Хотя ваш ответ имеет большой смысл, наличие более одного ярлыка - это то, что Titan не поддерживает. Поэтому я бы использовал его только в том случае, если нет другого пути. Надеюсь, это имеет смысл.:) – Rash

+0

Вы можете опустить общую метку в не-neo4j DB. Кроме того, структура должна быть одинаковой. – cybersam

+0

Спасибо! Немного ненужной работы, связанной с созданием метки на всех узлах (любой способ сделать ее автоматическим?), Но она выполняет свою работу. – ADTC

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