在neo4j中建模数据

时间:2017-06-12 11:21:40

标签: neo4j cypher

我有一个用于我的数据库的用户列表,以及每个用户可能拥有的固定的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))

在上述情况下索引也能帮助我,因为我最感兴趣的是获取用户数吗?

2 个答案:

答案 0 :(得分:1)

在所有情况下,您都可以通过节点和属性之间存在的路径进行检查,如下所示:

1 - 拥有property1property2以及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 - 具有property1property2 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)。

希望这有帮助, 汤姆

相关问题