此用例是图形数据库应用程序的候选者吗?

时间:2016-01-08 07:42:36

标签: database neo4j graph-databases

考虑我有一些用户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)如果是的话,如何建模节点和关系,以便我可以轻松获得给用户的列表。

1 个答案:

答案 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)

更新2

完全不同的想法是使用时间树。所有用户和列表定义都连接到时间树