如何在neo4j中查找包含字符串的所有标签

如何在neo4j中查找包含字符串的所有标签,neo4j,cypher,Neo4j,Cypher,尝试获取特定标签类型的所有节点。我有多个图形的根,它们的标签中都有相同的后缀。例如,我有3个节点,它们的标签末尾都有treeroot。因此,我可能将companytreeroot,buildingtreeroot,ndemployeetreeroot作为3个不同节点的3个有效标签。如何获取标签具有该模式的所有节点 我试过: match (n) where '.*treeroot' in labels(n) return n 及 但两者都返回空集…可用于将reqular表达式应用于标签: mat

尝试获取特定标签类型的所有节点。我有多个图形的根,它们的标签中都有相同的后缀。例如,我有3个节点,它们的标签末尾都有
treeroot
。因此,我可能将
companytreeroot
buildingtreeroot
,nd
employeetreeroot
作为3个不同节点的3个有效标签。如何获取标签具有该模式的所有节点

我试过:

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

但两者都返回空集…

可用于将reqular表达式应用于标签:

match (n) where ANY(l in labels(n) WHERE l =~ ".*treeroot")
return n
stdob--的答案是有效的,但它必须检查图形中所有节点的所有标签,因此随着图形的增长,这项工作变得越来越昂贵

更快的方法包括首先使用db.labels()过程快速查找匹配的标签,然后(因为Cypher本身不支持动态标签查询)使用过程使用字符串连接来组合查询,以查找所有匹配标签中的所有节点

下面是一个即使在大型图形上也应该非常快速的示例:

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

不确定这是否有帮助,但节点可以是多标签的。如果这不是自由字符串匹配,而是需要同时获得多个相似标签的节点,那么您可以考虑将标签添加到这些节点作为超级标签。类似于将:TreeRoot标签添加到具有某些TreeRoot标签(companytreeroot、buildingtreeroot、employeetreeroot)的所有节点,并确保将:TreeRoot添加到这些标签的任何新节点。这将使您对这些内容的查询比执行整个图形扫描更高效。这些匹配项将只检查完整字符串@InverseFalcon下面的答案是最有效的。一个。@MichaelHunger大多数时候,它确实是Neo4j的金锤。@InverseFalcon获得匹配标签的列表-一个好主意!感谢您指出“db.labels”过程。
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