考虑我有一些用户U1,U2,U3,每个用户都具有属性'age',以便;
U1.age = 10
U2.age = 30
U3.age = 70
我还有一些列表是基于某些标准的动态用户集合,例如L1,L2,L3,这样;
L1: where age < 60
L2: where age < 30
L3: where age > 20
由于列表是动态的,因此列表和用户之间的关系仅通过用户属性和列表条件建立。没有硬映射来指示哪些用户属于哪个列表。当任何用户的年龄发生变化或任何列表的条件发生变化时,与列表关联的用户也可能会发生变化。
在这种情况下,通过查询符合列表条件的用户,可以随时轻松地获取与列表关联的用户。
但是要获取与用户关联的列表,这是一项昂贵的操作,其中包括首先确定与每个列表关联的用户,然后选择那些结果有问题用户的列表。
这可能是使用图形数据库的候选者吗?为什么? (我正在考虑Neo4j)如果是的话,如何建模节点和关系,以便我可以轻松获得给用户的列表。
答案 0 :(得分:1)
从2.3 Neo4j开始允许索引范围查询。假设你有一个索引:
CREATE INDEX on :User(age)
然后,此查询会为您提供60岁以下的人员列表,并通过索引
执行MATCH (u:User) WHERE u.age < 60 RETURN u
然而,我不会存储年龄,而是将出生日期存储为长期财产。否则你可以一遍又一遍地使用年龄。
假设每个列表都有一个节点:
CREATE (:List{name:'l1', min:20, max:999})
CREATE (:List{name:'l2', min:0, max:30})
CREATE (:List{name:'l3', min:0, max:60})
让我们找到用户U1所属的所有列表:
MATCH (me:User{name:'U1'})
WITH me.age as age
MATCH (l:List) WHERE age >= l.min AND age <= l.max // find lists
WITH l
MATCH (u:User) WHERE u.age >= l.min AND age <= l.max
RETURN l.name, collect(u)
完全不同的想法是使用时间树。所有用户和列表定义都连接到时间树