Neo4j 2.0 уникальная ошибка ограничения "узел уже существует", когда он не

У меня возникли небольшие проблемы с уникальными ограничениями neo4j, когда оператор CREATE cypher не выполняется из-за того, что узел уже существует. Проблема в том, что это не существует. Кроме того, этот точный процесс с этими точными данными работал вчера.

Моя версия neo4j - это сообщество 2.0.0 (выпуск) на Ubuntu 12.04.3. Это моя текущая ситуация:

Мои ограничения:

tas@vtas:~$ neo4j-shell
neo4j-sh (?)$ schema
Indexes
  ON :ConsumerUser(tokens) ONLINE
  ON :Id(uuid)             ONLINE (for uniqueness constraint) #relevant
  ON :User(email)          ONLINE (for uniqueness constraint)
  ON :User(username)       ONLINE (for uniqueness constraint) 

Constraints
  ON (user:User) ASSERT user.email IS UNIQUE
  ON (user:User) ASSERT user.username IS UNIQUE
  ON (id:Id) ASSERT id.uuid IS UNIQUE                         #relevant

: Id.uuid должен быть уникальным.

У меня нет никаких данных:

neo4j-sh (?)$ dump
begin
create index on :`ConsumerUser`(`tokens`);
create index on :`Id`(`uuid`);
create index on :`User`(`email`);
create index on :`User`(`username`);
;

(также проверено с помощью шифра MATCH (n) return n;)

Проблемный запрос:

neo4j-sh (?)$ cypher 2.0 CREATE (i:Id{uuid:2});
CypherExecutionException: Node 82 already exists with label Id and property "uuid"=[2]

Вещи, которые я пробовал

  • tail -f /var/lib/neo4j/data/log/*.log /var/lib/neo4j/data/graph.db/*.log /var/log/neo4j/*.log за ошибки: вообще ничего не вошло
  • Перезапуск neo4j (service neo4j-service restart)
  • Выше tail при перезапуске (только удаленно интересная строка: [main] INFO org.neo4j.kernel.AutoConfigurator - WARNING! Physical memory(1017MB) is less than assigned JVM memory(4185MB). Continuing but with available JVM memory set to available physical memory)
  • удаление индексов (/var/lib/neo4j/data/graph.db/index/ и /var/lib/neo4j/data/graph.db/index.db) и перезапуск
  • восстановление выше, перезапуск
  • Поиск SO
  • Поиск вопросов по github neo4j

Пока ничего не помогло.

Вещи, которые я не буду пытаться

  • Решение здесь: ограничение neo4j удалило узел, потому что: удаление ограничения в производстве не вариант. Кроме того, это было несколько версий назад и другой вариант использования:
    1. ограничение на String[] вместо Int
    2. что-то было зарегистрировано
  • обновите до 2.0.1 способом "скрестим пальцы, и это может исправить", не зная, что это решено явно (мне нужно знать, почему это происходит)

Дополнительная информация

  • я имею ulimit -n а также ulimit -Hn установлен на 40K

  • neo4j-sh (?)$ dbinfo -g Kernel

    {
      "KernelStartTime": "Fri Feb 21 13:53:57 GMT 2014",
      "KernelVersion": "Neo4j - Graph Database Kernel (neo4j-kernel), version: 2.0.0",
      "MBeanQuery": "org.neo4j:instance=kernel#0,name=*",
      "ReadOnly": false,
      "StoreCreationDate": "Fri Feb 14 18:43:27 GMT 2014",
      "StoreDirectory": "/var/lib/neo4j/data/graph.db",
      "StoreId": "a3351846c194229c",
      "StoreLogVersion": 21
    }
    
  • Я видел это: https://github.com/neo4j/neo4j/issues/1069 но, похоже, решено.

  • Это на виртуальной машине VirtualBox на хосте MacOSX 10.6

Я в растерянности, время для моего первого ТАКОГО вопроса.

Простой ответ - "просто стереть все и начать заново" (или просто заново выполнить ограничение), но это не совсем приемлемо (что, если это произойдет на производстве?).

Есть идеи?

1 ответ

Ваша БД повреждена. Внутренне Neo4j имеет ссылку на этот узел, но вы удалили узел, поэтому эта ссылка ни на что не указывает. Вы не можете удалить его, потому что он не существует, и вы не можете создать его, потому что он ДУМАЕТ, что он существует. (Скорее всего, это было вызвано неправильным / неожиданным отключением базы данных. Не забудьте убедиться, что на этой машине есть резервная батарея в рабочем состоянии)

Вот почему вы ВСЕГДА РЕЗЕРВНЫЕ ДАННЫЕ В ПРОИЗВОДСТВЕ! Если осколок поврежден, вы можете просто очистить его и перезагрузить данные. Минимальное время простоя, и не нужно понимать, насколько оно коррумпировано, просто так оно и есть. Если у вас нет резервных копий (и у вас должны быть резервные копии за пределами площадки), вам потребуется экспортировать данные в CSV, очистить базу данных и загрузить данные CSV обратно. Под очисткой я имею в виду полное удаление старого каталога db. и пусть Neo4j создаст новый.

(Не пытайтесь спасти базу данных, не выполнив чистую очистку, поскольку, как только БД станет поврежденной, у вас не будет возможности узнать, что или как она была скомпрометирована.)

Другие вопросы по тегам