Neo4j中的标签是否自动编制索引?

Neo4j中的标签是否自动编制索引?,neo4j,graph-databases,Neo4j,Graph Databases,全新的图形数据库--欢迎更正 如果我想获得标有“用户”标签的节点列表,neo4j(或其他可能的图形数据库)是否需要搜索所有节点以查找该标签,还是以某种方式按标签自动索引节点 在没有索引的情况下,(糟糕的性能)会查询每个节点,以查看其任何标签是否与“用户”匹配,如下所示: List userNodes=new List(); 用于(节点:所有_节点) { 用于(标签:node.labels()) { if(label.name()=“用户”) { 添加(节点); //无需查看此节点的其他标签 打破

全新的图形数据库--欢迎更正

如果我想获得标有“用户”标签的节点列表,neo4j(或其他可能的图形数据库)是否需要搜索所有节点以查找该标签,还是以某种方式按标签自动索引节点

在没有索引的情况下,(糟糕的性能)会查询每个节点,以查看其任何标签是否与“用户”匹配,如下所示:

List userNodes=new List();
用于(节点:所有_节点)
{
用于(标签:node.labels())
{
if(label.name()=“用户”)
{
添加(节点);
//无需查看此节点的其他标签
打破
}
}
}
返回用户节点;
通过索引,系统获取一些系统管理的“节点”,该节点下有所有标签名称(搜索空间为几十而不是几百万),并获取其子节点:

  List<Node> userNodes = new List<Node>();
  for (Node labelNode : labels_node) // where labels_node is system-managed
  {
    if (labelNode.name() == "User")
    {
      // All children of the "User" node have the label "User"
      userNodes = labelNode.children();

      // No need to look at other labels
      break;
    }
  }
  return userNodes;
List userNodes=new List();
for(Node labelNode:labels\u Node)//其中labels\u Node是系统管理的
{
if(labelNode.name()=“用户”)
{
//“User”节点的所有子节点都有标签“User”
userNodes=labelNode.children();
//无需查看其他标签
打破
}
}
返回用户节点;
最终,我想这个问题会变成这样:如果我要建立一个“事物”列表,我需要按事物类型检索所有这些事物,我应该使用标签来完成这项工作吗?或者我应该创建自己的“用户”节点,该节点指向所有用户节点,并且仅在找到所需节点子集后使用标签


这似乎是相似的,虽然更模糊,但没有得到令人满意的答案。

是的标签会自动索引,这意味着如果您有1000个用户节点,其中700个是活动用户,查询活动标签只会返回700个活动用户,而不会查找其他用户

拥有超级节点并将相关节点连接到它们是一个(几乎总是)坏主意

此外,您还应该为数据库建模以便于查询,请看以下令人惊讶的答案:

对于在节点上使用标签或索引属性之间的区别,也有一个主题,这篇博文对此进行了很好的解释:

您还应该分析您的查询,这意味着从一开始就导入100万个节点是没有意义的,请尝试使用100个节点并执行一些查询

我在neo4j总部听到一句令人惊讶的话:

忠实于你的图表,图表就会忠实于你


找到解决问题的方法

在术语方面,文档讨论的是“标签和模式索引”。“索引”是附加在标签属性上的内容,例如为
:Person
节点的所有
名字
属性编制索引

但对于您的问题,标签的行为类似于索引,因为是的,执行引擎会利用它们,并像使用索引一样使用它们,即使文档没有将标签作为索引来讨论

因此,作为一个具体的例子,假设我们有一个100万节点的图,其中5个节点的标签是
:Person
。假设我们有以下查询:

MATCH (p:Person) RETURN p;
问题归结为,密码需要考虑多少个节点?答案是5,而不是100万


您的第二个代码片段更像是neo4j 1.9版的方法;现在,我不会创建这些人工的“索引节点”,也不会循环遍历所有可能的标签,我只会按标签匹配并使用它。

中有一个专用的方法

ops = GlobalGraphOperations.at(gdb);
for (Node node : ops.getAllNodesWithLabel(DynamicLabel.label("User")) {
  // do sth with node
}

它在后台使用优化的标签扫描存储。

与来自
MATCH(u:User)的任何差异返回u
ops = GlobalGraphOperations.at(gdb);
for (Node node : ops.getAllNodesWithLabel(DynamicLabel.label("User")) {
  // do sth with node
}