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