2013-12-17 8 views
5

Wenn mit Eigenschaften in Cypher tun haben, können Sie reguläre Ausdrücke verwenden, um Eigenschaftswerte zu entsprechen in etwa so:Neo4j 2.0 Wildcard-Suche auf Markennamen

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

Ich mag würde das Gleiche mit einem Markennamen zu tun. Ich möchte alle eindeutigen Labels erhalten, die eine bestimmte Zeichenfolge enthalten. Etwas wie:

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

Kann dies getan werden ist Cypher? oder das RestAPI? Reguläre Ausdrücke?

Ich benutze Neo4j 2.0 Release.

Antwort

8

Sie können Regex nicht direkt auf Etiketten verwenden. Jedoch mit der labels Funktion ist dies möglich:

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

Bitte beachten Sie, dass diese Abfrage möglicherweise teuer ist, da es alle Knoten in Ihrem db berührt. Möglicherweise möchten Sie Ihr Datenmodell umgestalten, um mehrere Labels zu verwenden, z. CourseundCourse_xyz_001. In diesem Fall können Sie MATCH (n:Course) .... verwenden, wodurch die Anzahl der zu besuchenden Knoten an erster Stelle reduziert wird.

+0

+1 auf die Mehrfachetiketten, alternativ verwenden Sie einen Index zu ': Course (type)' und setzen Sie "Driving_001" in Ihr 'type' Attribut. Das könnte aber langsamer sein. –

+0

Auch mit mehreren Labels, ich denke, das würde am Ende zu langsam sein. Ich denke, ich werde versuchen, die Markennamen in ihrem eigenen Diagramm zu speichern, wenn ein neues erstellt wird. Auf diese Weise kann ich sie schnell finden. Möglicherweise kann ich Ihr Beispiel jedoch auch für andere Fälle verwenden. Vielen Dank! –

Verwandte Themen