假设我有一些用户 U1、U2、U3,每个用户都具有属性“年龄”;
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)如果是,如何对节点和关系建模,以便我可以轻松获得给定用户的列表。
最佳答案
从 2.3 开始,Neo4j 允许索引范围查询。假设您有一个索引:
CREATE INDEX on :User(age)
然后此查询会为您提供 60 岁以下的人员列表,并通过索引执行
MATCH (u:User) WHERE u.age < 60 RETURN u
但是我不会存储年龄,而是将出生日期存储为 long 属性。否则你的年龄会翻来覆去。
根据下面的评论更新
假设每个列表都有一个节点:
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)
更新2
一个完全不同的想法是使用时间树。所有用户和您的列表定义都连接到时间树
关于database - 这个用例是图形数据库应用程序的候选者吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34671838/