neo4j如何使用Cypher返回所有节点标签?

79
我不知道如何使用Cypher返回节点标签。
有人知道如何执行此操作的语法吗?
8个回答

106

获取所有不同的节点标签:

MATCH (n) RETURN distinct labels(n)

获取每个标签的节点计数:

MATCH (n) RETURN distinct labels(n), count(*)

5
MATCH n RETURN DISTINCT LABELS(n) 这样打字可以少输入8个字符 :) - F Lekschas
同意@FLekschas的观点,此外,Neo建议您在较新的Neo4j数据库中使用MATCH,因为START是用于旧版索引的。 - ADTC
Neo.ClientError.Statement.SyntaxError 语法错误,模式中需要使用括号来标识节点,例如 (n) ... (v. 3.1.1) - vladkras
7
除了Cypher标签之外,这个问题也有neo4j标签。获取所有不同节点标签的最短且执行速度最快的查询是 CALL db.labels -- 至少在neo4j3.0及以后版本中如此,详情请参见neo4j手册中的 CALL 页面。 - unserializable
如何为节点列表返回标签? - user3701435

63

有一个函数 labels(node) 可以返回节点的所有标签。


43

Neo4j 3.0引入了过程db.labels(),该过程返回数据库中所有可用的标签。使用:

call db.labels();

3
这是最高效的方法。 - zhibo
在我的DigitalOcean测试数据库上,call只返回扁平化列表,而MATCH将它们作为["RawFile", "RawPhoto"]返回,前者需要4ms,后者需要15ms。注:我有分层标签。 - joshfindit
为什么这个很难找到。 - Iman Akbari

25

如果你想要所有单独的标签(而非组合),你可以随时在答案中进行展开:

MATCH (n)
WITH DISTINCT labels(n) AS labels
UNWIND labels AS label
RETURN DISTINCT label
ORDER BY label

5
 START n=node(*) RETURN labels(n)

目前这个结果是一场噩梦。对于每个节点,返回1行。START n=node(*) RETURN DISTINCT(labels(n))MATCH (n) RETURN distinct labels(n)的结果相同,但是需要花费大约10倍的时间(在我的数据库上)。 - joshfindit

4

如果您正在使用Java API,您可以通过以下方式快速获取数据库中所有Label的迭代器:

GraphDatabaseService db = (new GraphDatabaseFactory()).newEmbeddedDatabase(pathToDatabase);
ResourceIterable<Label> labs = GlobalGraphOperations.at(db).getAllLabels();

2
使用Cypher - c z

4
如果您想获取特定节点的标签,请使用labels(node); 如果您只想获取neo4j中所有节点的标签,则可以使用此函数:call db.labels;,绝不要使用此查询:MATCH n RETURN DISTINCT LABELS(n)。它会进行全表扫描,非常非常慢。

0

匹配(n) WHERE n.name="abc" 返回 labels(n)

它返回节点“abc”的所有标签


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接