哪种情况有更高的性能

时间:2016-08-12 12:25:56

标签: neo4j cypher

我的图形数据库上有大约10 k个用户节点。我知道它不是太多,但我正在为我的案例寻找最佳解决方案。

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

我想出了两个解决方案(至少目前为止),但我无法确定哪一个最适合性能,您对我可能的解决方案有何看法?

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

如果您知道解决我问题的另一种方式,我愿意接受意见。

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

CREATE INDEX ON :User(marked);

然后,您的查询将能够快速获取标记的User节点,而无需扫描所有节点。

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

答案 1 :(得分:0)

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

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

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

查找变得容易,因为它是该标签中的所有用户。只需匹配,进行处理,然后删除标签。如果您可以在一个查询中执行此操作,则看起来像:

MATCH (u:MarkedUser)
// do your processing here
REMOVE u:MarkedUser