【问题标题】:How to find all labels that contain string in neo4j如何在neo4j中找到所有包含字符串的标签
【发布时间】:2017-06-22 18:33:13
【问题描述】:

试图获取某个标签类型的所有节点。我有多个图的根,它们的标签都具有相同的后缀。例如,我有 3 个节点,它们的标签末尾都有 treeroot。所以我可能将companytreerootbuildingtreeroot、nd employeetreeroot 作为 3 个不同节点的 3 个有效标签。如何获取标签具有该模式的所有节点?

我试过了:

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

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

但两者都返回空集...

【问题讨论】:

  • 不确定这是否会对您有所帮助,但节点可以是多标签的。如果这不是免费的字符串匹配,而是需要一次跨多个相似标签获取节点,那么您可以考虑将标签添加到这些节点作为超标签。就像将 :TreeRoot 标签添加到具有某些树根标签(companytreeroot、buildingtreeroot、employeetreeroot)的所有节点,并确保您也将 :TreeRoot 添加到这些标签的任何新节点。这将使您对这些的查询比执行整个图形扫描更有效。
  • 那些匹配只会检查完整的字符串。 @InverseFalcon 下面的答案是最有效的。一。

标签: neo4j cypher


【解决方案1】:

您可以使用ANY function 将正则表达式应用于标签:

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
    

    【讨论】:

    • @MichaelHunger 它确实是 Neo4j 的金锤,很多时候。
    • @InverseFalcon 获取匹配标签列表 - 好主意!并感谢您指出程序“db.labels”。
    猜你喜欢
    • 2023-01-31
    • 2015-02-18
    • 2011-01-28
    • 2011-05-30
    • 2011-12-28
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多