2013-12-17 9 views
5

Gdy mamy do czynienia z właściwościami w Cypher, można użyć wyrażeń regularnych, aby dopasować wartości nieruchomości tak:Neo4j wyszukiwarka 2,0 wieloznaczny na nazwach etykiet

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

Chciałbym zrobić to samo z nazwy. Chciałbym uzyskać wszystkie unikalne etykiety zawierające pewien ciąg znaków. Coś takiego:

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

Czy można to zrobić to Cypher? lub RestAPI? Wyrażenia regularne?

Używam wydania Neo4j 2.0.

Odpowiedz

8

Nie można bezpośrednio używać wyrażeń regularnych na etykietach. Jednak używając funkcji labels jest to możliwe:

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

Należy pamiętać, że ta kwerenda jest potencjalnie kosztowne, ponieważ dotyka wszystkich węzłów w swojej db. Możesz chcieć zmienić swój model danych, aby użyć wielu etykiet, np. CourseiCourse_xyz_001. W takim przypadku można użyć numeru MATCH (n:Course) ...., który zmniejsza liczbę węzłów do odwiedzenia na pierwszym miejscu.

+0

+1 na wielu etykietach, alternatywnie użyj indeksu na ': Course (type)' i wpisz "Driving_001" w swoim atrybucie 'type'. To może być wolniejsze. –

+0

Nawet z wieloma etykietami, myślę, że skończyłoby się to zbyt wolno. Myślę, że spróbuję zapisać nazwy etykiet na ich własnym wykresie za każdym razem, gdy powstanie nowy. W ten sposób będę mógł je szybko znaleźć. Być może jednak będę mógł posłużyć się przykładem dla innych przypadków. Dzięki! –