2016-08-12 109 views
0

我的图形数据库中有大约10k个用户节点。我知道它不是太多,但我正在寻找我的案例的最佳解决方案。哪种情况下性能更好

我需要标记一些用户并在以后查询。

我想出了两个解决方案(至少现在),但我无法确定哪一个解决方案最适合性能,您如何看待我的可能解决方案?

1 - 我可以添加新属性给我所有的用户节点默认值为false。

MATCH (u:User) SET u.marked = false 

之后,我会为所有需要稍后查询的用户设置标记属性为true。可以说有50个。

后来,当我需要的那些标记的用户,我会查询,如:

MATCH (u:User) WHERE u.marked = true RETURN u 

2 - 我可以新属性仅添加到这些用户,我将在以后需要,不修改其他用户节点。像下面这样:

MATCH (u:User) WHERE u.id IN [...,123,456,789,...] SET u.marked = true 

后来,当我需要显着的用户,我会查询,如:

MATCH (u:User) WHERE u.marked = true RETURN u 

MATCH (u:User) WHERE EXISTS(u.marked) AND u.marked = true RETURN u 

如果你知道解决我的问题的另一种方式,我是征求意见。

在此先感谢。

+0

您可以将标记的用户标识存储在单独的表中。当你需要再次标记它们时,你只需清除以前的结果并保存新的结果。如果需要,稍后可以轻松添加其他属性。 – Edgar

+0

在查询之前使用'PROFILE'会得到它的详细信息。 like'PROFILE MATCH(u:User)WHERE u.marked = true RETURN u' –

+0

只要你知道,在描述的第二个选项中,u.marked = true的匹配就足够了。这里不需要存在检查。 – InverseFalcon

回答

1

通常的方法是创建一个索引:

CREATE INDEX ON :User(marked); 

然后,你的查询就能迅速得到了标记为User节点,而不必扫描所有节点。

@ InverseFalcon的答案提出了另一种可能的方法,即创建一个标签。

+0

这一个似乎最适合我的情况,非常感谢。 – agdelen

0

布尔字段应该正常工作。 Usman Maqbool提出的分析不同方法的建议是很好的......这样做可以找到最适合您的方法。

另一种方法是为此创建一个标签,例如:MarkedUser。请记住,节点可以有多个标签没有问题。

您可以使用(对于用户u)SET u:MarkedUser在您感兴趣的一组用户上设置标签。

查找变得容易,因为它是该标签中的所有用户。只要匹配,做你的处理,然后删除标签。如果你能做到这一切在一个查询中,它看起来像:

MATCH (u:MarkedUser) 
// do your processing here 
REMOVE u:MarkedUser 
相关问题