我有一个用于我的数据库的用户列表,以及每个用户可能拥有的固定的30-35个属性集。这些属性可能会随着时间而改变,因此我为每个属性创建了节点,为每个用户创建了一个节点。
为了更新属性,我使用相应的属性连接或删除该用户的关系,我已为每个用户和属性分配了唯一的ID。
我想回答一些查询,例如具有(property1和property2和property3)的用户数,具有(property1或property2)的用户数等等
如何回答第一类查询?对于我使用的两个属性:
match (p1:property)<--(n:user)-->(p2:property) p1.id=1 and p2.id=2 return count(distinct(n))
如何回答使用'and'子句加入的多个属性,使用'或'子句很容易:
match (n:user)-->(p:property) where p.id in [1,2] return count(distinct(n))
如何使用“和”和“或”子句组合来回答查询,例如: 用户((property1和property2)或(property1和property2))
在上述情况下索引也能帮助我,因为我最感兴趣的是获取用户数吗?
答案 0 :(得分:1)
在所有情况下,您都可以通过节点和属性之间存在的路径进行检查,如下所示:
1 - 拥有property1
和property2
以及property3
的用户数量:
MATCH (u:user)
WHERE
(u)-->(:property {id : 1})
AND
(u)-->(:property {id : 2})
AND
(u)-->(:property {id : 3})
RETURN COUNT(DISTINCT(u))
可替换地:
MATCH (u:user),
(u)-->(:property {id : 1}),
(u)-->(:property {id : 2}),
(u)-->(:property {id : 3})
RETURN COUNT(DISTINCT(u))
2 - 具有property1
和property2
或 property3
的用户数量:
MATCH (u:user)
WHERE
(u)-->(:property {id : 1})
AND
(u)-->(:property {id : 2})
OR
(u)-->(:property {id : 3})
RETURN COUNT(DISTINCT(u))
要提高性能,请尝试在:属性节点的id
属性中添加索引。这样:
CREATE INDEX ON :property(id)
答案 1 :(得分:0)
我仍然不相信你希望每个属性都是一个节点。新属性可以是 SET ,过时的属性可以是 REMOVE d。并且可以使用 EXISTS 检查属性是否存在。
肯定有理由将属性转换为节点,但上面不是它(imo)。
希望这有帮助, 汤姆