Операторы числового сравнения и подстановочные знаки в Gremlin

Есть ли способ поиска ручного индекса в Neo4j с использованием оператора числового сравнения (>=, ‹=, ‹, >, ...)? Глядя на примеры индекса Gremlin, все они, как правило, представляют поиск с определенным значением свойства.

Скажем, у меня есть около 10 миллионов отношений двух типов, каждый из которых имеет числовое значение в свойстве, называемом «свойство», в первом двойном, во втором int.

gremlin> g.e(123).getProperty('property')
==> 1.57479276459179

Теперь, если бы я знал точное значение свойства, которое представляет собой логарифмическое значение pvalue типа double, я мог бы легко найти узел с помощью

gremlin> g.idx('index_e_ASSOC').get('property', 1.57479276459179)
==> e[2421730][31493-ASSOCIATION->53378]
==> e[4885094][53378-ASSOCIATION->31493]
==> e[866409][37891-ASSOCIATION->6292]
==> e[123][6292-ASSOCIATION->37891]

Вместо этого я хочу выполнить поиск диапазона для «свойства», например, найти все ребра, в которых «свойство» >= 0 && «свойство» ‹= 1,6. Это что-то, что можно было бы сделать с Гремлином? Глядя на группу обсуждения пользователей Gremlin, я понял, что даже поиск по подстановочным знакам из полнотекстового индекса Lucene немного хакерский, и API Neo4j не помогает.

Изменить: нашел еще один подобный вопрос в Stackoverflow (под названием «Запросы диапазона в Neo4j с использованием синтаксиса запросов Lucene»; новые пользователи могут публиковать максимум две гиперссылки), которые ведут к документации Neo4j. Я воссоздал индекс, используя ValueContext для числовых значений. Следуя примеру, найденному в дискуссионной группе neo4j (название: объединить запрос numericRange с запросом отношения), я могу выполнить запрос, например

start a=node(123)
match a-[rel]-(b)
where type(rel) = "ASSOCIATION" AND rel.`property` > 1.0 AND rel.`property` < 2.0
RETURN b
LIMIT 20;

который использует поиск по диапазону. Какой синтаксис у Гремлина? Это должно быть что-то вроде

g.idx('index_e_ASSOC')[[property: Neo4jTokens.QUERY_HEADER + "[1.0 TO 2.0]"]].count()

Это синтаксически правильно, но count дает 0 результатов, даже если в этом диапазоне есть ребра со свойством.


person amergin    schedule 05.07.2012    source источник


Ответы (2)



Вероятно, лучше всего использовать Neo4j API через groovy, как http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting ?

person Peter Neubauer    schedule 09.07.2012