Neo4j и spring-data: шифрование числовых индексов не работает?

возникли проблемы с шифрованием запросов и числовыми индексами

@Indexed(unique = true, numeric = false)
private Long accountId;

Возвращает:

neo4j-sh (0)$ start n=node:Principal(accountId = '1') return n;      
+---------------------------------------------------------------------------------------------+
| n                                                                                           |
+---------------------------------------------------------------------------------------------+
| Node[41722]{__type__:"example.package.Principal",accountId:1,name:"Simple User"} |
+---------------------------------------------------------------------------------------------+
1 row

Но

@Indexed(unique = true, numeric = true)
private Long accountId;

Возвращает:

neo4j-sh (0)$ start n=node:Principal(accountId = '1') return n; 
+---+
| n |
+---+
+---+
0 row

neo4j 1.9.2
spring-data-neo4j 2.3.0.RC1

Если я правильно понимаю, это может быть отменено, это обсуждение, но оно довольно старое?

ОБНОВЛЕНИЕ:

если я использую

@Indexed(unique = true, numeric = false)

Происходит еще одна интересная вещь. Проверка существования отношения (на самом деле оно существует в БД):

count(r) равен 0 - неверно:

Long accountId = 1L;
Map<String, Object> result = template.query(
        "START child=node:Principal(accountId='{childId}') " +
                "MATCH child-[r:IS_MEMBER_OF]->parent " +
                "RETURN count(r)", MapUtil.map("childId", accountId)).singleOrNull();

count(r) равен 1 - правильно:

Long accountId = 1L;
Map<String, Object> result = template.query(
        "START child=node:Principal(accountId='1') " +
                "MATCH child-[r:IS_MEMBER_OF]->parent " +
                "RETURN count(r)",null).singleOrNull();

person gerasalus    schedule 07.08.2013    source источник


Ответы (1)


Поиск числового индекса не работает из шифра с литеральными значениями, синтаксический анализатор lucene не создает правильные внутренние запросы. Также с параметрами обычные примитивные значения, переданные в индекс, обрабатываются как строки в реализации neo4j lucene, поскольку запрос не может знать, были ли данные проиндексированы численно или как строка.

// this won't work, you have to remove the single quotes around '{childId}'
"START child=node:Principal(accountId='{childId}') " +

    "MATCH child-[r:IS_MEMBER_OF]->parent " +
    "RETURN count(r)", MapUtil.map("childId", accountId)).singleOrNull();

Единственный способ получить числовые запросы для работы с шифром — это передать значение ValueContext.numeric(1) в качестве параметра в карте параметров Java во встроенную базу данных.

person Michael Hunger    schedule 08.08.2013
comment
Еще один вопрос, правильно ли я понял, что если я использую @Indexed (unique = true, numeric = true), то я не могу выполнить шифрованный запрос из консоли neo4j/Neoeclipse? - person gerasalus; 22.08.2013