图表数据库全新 - 欢迎更正。
如果我想获得标有“用户”标签的节点列表,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虽然比较模糊,但却没有得到满意的答案。
答案 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
对于在节点上使用标签或索引属性之间的区别,还有一个主题,这篇博文非常好地解释了这一点:
您还应该对您的查询进行概要分析,这意味着在开始时导入100万个节点,尝试使用100并进行一些查询是没有意义的。
我听到neo4j hq上的某个人的惊人判决:
忠实于你的图表,图表将忠实于你
以解决问题的方式找到你的方法!
答案 2 :(得分:0)
中有专门的方法
ops = GlobalGraphOperations.at(gdb);
for (Node node : ops.getAllNodesWithLabel(DynamicLabel.label("User")) {
// do sth with node
}
在幕后使用优化的标签扫描存储。