2017-02-05 2 views
0

Попытка получить все узлы определенного типа метки. У меня есть корни из нескольких графиков, которые имеют одинаковый суффикс в своих меток. Например, у меня есть 3 узла, у которых все есть treeroot в конце их ярлыка. Поэтому у меня могло бы быть companytreeroot, buildingtreeroot, nd employeetreeroot как 3 допустимых ярлыка для 3 отдельных узлов. Как я могу получить все узлы, чей ярлык имеет этот шаблон?Как найти все метки, содержащие строку в neo4j

Я пробовал:

match (n) where '.*treeroot' in labels(n) return n 

и

match (n) where 'treeroot' in labels(n) return n 

но оба возвращают пустые наборы ...

+0

Неуверенный, если это поможет, но узлы могут быть мульти-меченый. Если это не произвольное совпадение строк, но вместо этого нужно сразу получить узлы на нескольких похожих ярлыках, то вы можете подумать о добавлении метки к этим узлам в качестве супермаркировки. Подобно добавлению метки TreeRoot ко всем узлам с помощью метки трэроты (companytreeroot, buildingtreeroot, employeetreeroot) и обеспечения добавления TreeRoot к любым новым узлам этих меток. Это позволит вашим запросам на них быть более эффективными, чем выполнение всего сканирования графика. – InverseFalcon

+0

Эти совпадения будут проверяться только на полные строки. @ Ответ InverseFalcon ниже является наиболее эффективным. один. –

ответ

1

Вы можете использовать ANY function для применения reqular выражения этикеток:

match (n) where ANY(l in labels(n) WHERE l =~ ".*treeroot") 
return n 
2

stdob - ответ отвечает, но он должен проверять все метки всех узлов на вашем графике, поэтому это становится все дороже по мере роста вашего графика.

Более быстрый подход предполагает сначала поиск ярлыков, которые быстро совпадают с использованием процедуры db.labels(), тогда (поскольку Cypher не поддерживает динамические запросы ярлыков) используют процедуру APOC Procedures' cypher.run() для использования конкатенации строк для сборки запроса, который находит все узлы во всех ярлыках, которые соответствовали вашему совпадению.

Вот пример, который должен быть достаточно быстрым, даже на больших графах:

CALL db.labels() YIELD label 
WITH label 
WHERE label ENDS WITH 'treeroot' 
CALL apoc.cypher.run('MATCH (n:' + label + ') return n', null) YIELD value 
RETURN value.n as node 
+0

Хороший! Также хороший пример для apoc. –

+0

@MichaelHunger Это действительно золотой молот Neo4j, большую часть времени. – InverseFalcon

+0

@InverseFalcon Получить список подходящих ярлыков - отличная идея! И спасибо за указание процедуры «db.labels». –

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