Neo4j 使用公共实体计算用户计数

Neo4j 使用公共实体计算用户计数,neo4j,cypher,Neo4j,Cypher,我想确定有共同兴趣的用户组 数据模型与特征 用户和兴趣是节点标签,表示唯一的节点 喜欢是它们之间的关系,(用户)-[:喜欢]->(兴趣) 节点的所有属性都被索引 关系性质可以描述为节点之间的多对多 有300多个兴趣点和120000多个用户 我使用以下查询来确定具有一个共同兴趣和所有其他兴趣的用户数 MATCH (u:User)-[:LIKES]-(i:Interest) WHERE i.name = "Baking" WITH u MATCH (u)-[:LIKES]-(

我想确定有共同兴趣的用户组

数据模型与特征
  • 用户兴趣是节点标签,表示唯一的节点
  • 喜欢是它们之间的关系,(用户)-[:喜欢]->(兴趣)
  • 节点的所有属性都被索引
  • 关系性质可以描述为节点之间的多对多
  • 有300多个兴趣点和120000多个用户
我使用以下查询来确定具有一个共同兴趣和所有其他兴趣的用户数

MATCH (u:User)-[:LIKES]-(i:Interest)
WHERE i.name = "Baking"
WITH u
MATCH (u)-[:LIKES]-(i:Interest)
WHERE i.name <> "Baking"
RETURN i.name, COUNT(u) AS userCount
ORDER BY userCount DESC
MATCH(u:User)-[:LIKES]-(i:Interest)
其中i.name=“烘焙”
和你
匹配(u)-[:喜欢](i:兴趣)
我的名字叫“烘焙”
返回i.name,COUNT(u)作为userCount
按用户计数说明订购
我试着提出一个可以有3个共同兴趣点的问题,但这使它变得更慢。我认为这不是一个好的、可伸缩的设计,有人能帮忙吗


虽然这可能不太合理,但最终目标是计算nxn兴趣组合。

也许你应该限制兴趣,只选择前五名或其他什么? 此外,我不知道您的数据模型,但我的兴趣是唯一的节点。这将加快查询速度。所以关系[has interest]->(baking)指向同一个节点,您可以从baking开始获取所有用户。
可能翻转查询并从兴趣开始(cypher很奇怪),或者您可以强制查询使用索引

用户应该至少有5个最常见的兴趣组。是的,每个兴趣点都是一个唯一的节点,我正在使用索引。如果他没有使用索引,您也可以使用索引x:interest(name)。您还可以使用explain和profile查看查询计划。您如何使用3个共同兴趣?您对3个共同兴趣使用什么查询?我会做一些像Match(interest1)-[]->(user1),(interest2)-[]->(user1),(interest3)-[]->(user1)是的,我也做了同样的事情。我将尝试分析查询,谢谢提示。