我的图形数据库上有大约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
如果您知道解决我问题的另一种方式,我愿意接受意见。
提前致谢。
答案 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