2013-12-17 9 views
5

При работе со свойствами в Cypher, вы можете использовать регулярные выражения для сопоставления значений свойств следующим образом:Neo4j поиск 2,0 подстановочных на именах меток

Match (n)-[:IS_A]-() where (n:Course_Driving_001) and (n.name =~ '(?i).*criteria.*' or n.description =~ '(?i).*criteria.*') return distinct n limit 20; 

Я хотел бы сделать то же самое с именем метки. Я хотел бы получить все уникальные ярлыки, содержащие определенную строку. Что-то вроде:

Match (n)-[:IS_A]-() where (n:Course_*_001) return distinct n; 

Можно ли это сделать Cypher? или RestAPI? Обычные выражения?

Я использую Neo4j 2.0 Release.

ответ

8

Вы не можете напрямую использовать регулярное выражение на этикетках. Однако с помощью функции labels это возможно:

MATCH (n)-[:IS_A]->() 
WHERE any(l IN labels(n) WHERE l=~'Course_*_001') 
RETURN distinct n; 

Обратите внимание, что этот запрос является потенциально дорогостоящим, поскольку это касается всех узлов в вашей БД. Возможно, вам захочется реорганизовать вашу модель данных, чтобы использовать несколько меток, например. CourseиCourse_xyz_001. В этом случае вы можете использовать MATCH (n:Course) ...., что уменьшает количество узлов, которые нужно посетить на первом месте.

+0

+1 на нескольких ярлыках, в качестве альтернативы используйте индекс ': Course (type)' и поместите «Driving_001» в свой атрибут 'type'. Это может быть медленнее, хотя. –

+0

Даже с несколькими ярлыками, я думаю, что это будет слишком медленным. Я думаю, что я попытаюсь сохранить имена ярлыков на своем собственном графике всякий раз, когда будет создан новый. Таким образом, я смогу быстро их найти. Однако я могу использовать ваш пример для других случаев. Благодаря! –

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