2013-06-18 2 views
2

Мои узлы имеют свойство массива category_ids, которое содержит целые числа.Отфильтруйте узлы neo4j путем вычитания узлов, возвращаемых индексом

Я могу запросить узлы, чьи category_ids не соответствуют ни в списке [1,2,3]:

START node(*) 
WHERE NOT(ANY(x in node.category_ids WHERE x IN [1,2,3])) 
RETURN node; 

можно использовать индекс (я называю это nodes_categories и это стандартная точная индекс Lucene), чтобы начать с узлами, которые я хочу, чтобы отфильтровать:

START excluded=node:nodes_categories("category_ids:(1 2 3)") 
RETURN excluded; 

Но как я могу использовать индекс, чтобы получить узлы I сделать хотите? IE возвращает все узлы минус узлы, возвращаемые моим индексом? Вот мой старт:

START node=node(*), excluded=node:nodes_categories("category_ids:(1 2 3)") 
??? 
RETURN node; 

Edit: Neo4j версия 1.9.M02

ответ

3

Наивный способ (обновлено):

START node=node(*), excluded=node:nodes_categories("category_ids:(1 2 3)") 
WITH collect(excluded) as excluded, node 
WHERE not node in(excluded) 
RETURN distinct node; 

Лучше всего было бы, чтобы выяснить, как запросить индекс для только тех узлов, которые вы хотите. Я не уверен, есть ли способ сделать это в синтаксисе lucene. Может быть, что-то вроде:

START node=node:nodes_categories('category_ids:(* NOT 1 NOT 2 NOT 3)') 
return node; 
+0

Наивный способ, похоже, работает только в том случае, если индексный удар возвращает один узел, иначе он возвращает все узлы, в том числе те, которые попадают в индексный хит. Лучший способ действительно работает. Но я хочу включить узлы, отсутствующие в индексе, поэтому я действительно хотел бы получить наивный способ работать. –

+0

Также наивный способ возвращает 0 узлов вместе, если индексный удар возвращает 0 узлов. Я могу смело предположить, что индексный удар вернет хотя бы 1 узел, но я указываю на это, чтобы выяснить, что происходит. –

+0

Хм, хорошо. Наверное, я не думал об этом полностью. –

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