标签是否在Neo4j中自动编入索引?

时间:2015-01-26 18:45:56

标签: neo4j graph-databases

图表数据库全新 - 欢迎更正。

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

如果没有索引,(可怕的性能)会查询每个节点以查看其中任何一个标签是否与“User”匹配,如下所示:

List<Node> userNodes = new List<Node>();
for (Node node : all_nodes)
{
  for (Label label : node.labels())
  {
    if (label.name() == "User")
    {
      userNodes.Add(node);

      // no need to look at other labels for this node
      break;
    }
  }
}
return userNodes;

通过索引,系统会抓取一些系统管理的“节点”,其中包含所有标签名称(数十个而不是数百万的搜索空间)并抓取其子节点:

  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;

最终,我认为这个问题可以解决这个问题:如果我要构建一个“事物”列表,我需要按照事物的类型检索所有这些,我应该使用标签来完成这个?或者我应该创建自己的“用户”节点,该节点指向所有用户节点,只有在找到我想要的节点子集后才使用标签?

似乎this question虽然比较模糊,但却没有得到满意的答案。

3 个答案:

答案 0 :(得分:5)

术语明智,文档谈论“标签和模式索引”。 “index”是您在label属性上附加的内容,例如索引first_name个节点的所有:Person属性。

但是对于你的问题,标签的行为类似于索引因为是的,执行引擎利用它们并像你期望的那样使用它们,即使文档没有谈论标签作为索引。

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

MATCH (p:Person) RETURN p;

问题归结为,密码需要考虑多少个节点?答案是5,而不是100万。

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

答案 1 :(得分:1)

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

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

此外,您应该为查询目的建模数据库,看看这个惊人的答案:

Neo4J - Storing into relationship vs nodes

对于在节点上使用标签或索引属性之间的区别,还有一个主题,这篇博文非常好地解释了这一点:

http://graphaware.com/neo4j/2015/01/16/neo4j-graph-model-design-labels-versus-indexed-properties.html

您还应该对您的查询进行概要分析,这意味着在开始时导入100万个节点,尝试使用100并进行一些查询是没有意义的。

我听到neo4j hq上的某个人的惊人判决:

  

忠实于你的图表,图表将忠实于你

以解决问题的方式找到你的方法!

答案 2 :(得分:0)

中有专门的方法
ops = GlobalGraphOperations.at(gdb);
for (Node node : ops.getAllNodesWithLabel(DynamicLabel.label("User")) {
  // do sth with node
}

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