2017-02-05 74 views
0

尝试获取某个标签类型的所有节点。我有多个图形的根,它们的标签中都有相同的后缀。例如,我有3个节点,它们的标签末尾都有treeroot。所以我可以将companytreeroot,buildingtreerootemployeetreeroot作为3个不同节点的3个有效标签。我将如何获得标签具有该模式的所有节点?如何查找neo4j中包含字符串的所有标签

我想:

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

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

但都返回空套...

+0

不确定这会帮助你,但节点可以是多重标记。如果这不是可用的字符串匹配,而是需要一次获取跨多个相似标签的节点,那么您可以考虑将标签作为超级标签添加到这些节点。就像将TreeRoot标签添加到具有某些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”过程。 –

相关问题