繁体   English   中英

neo4j(密码)非常慢

[英]neo4j (cypher) is very slow

我正在尝试建立人们在Facebook上喜欢的不同实体的图表,以创建基本的跨域推荐引擎。

我有不同实体(电影,书籍,音乐等)的数据。 将为每个项目创建节点,这些节点具有作为项目名称(电影,书籍等的名称)和项目的实体类型(电影,书籍等)的属性。 任何两个节点之间都有称为“亲和力”的关系。 此关系还具有“强度”属性,该属性等于“否”。 喜欢这两个项目的人群。

我使用FB用户连接这些节点。 FB用户也是图中的节点,其属性为人员名称,类型为人员。 这些节点与项目节点之间的关系称为“喜欢”。 现在,如果某人喜欢电影,我想通过遍历图表来推荐他的书籍或音乐。 这是我试图遍历图的密码查询:

START root = node(<LIKED_MOVIE_NODE_ID>)
MATCH p = root-[rel1:affinity*..3]-(movies)<-[rel2:likes]-(persons)-[rel3:likes]->(books)
WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books"
RETURN books

这运行非常慢,有时需要长达500秒的时间。 我有大约13000部电影,2000本书和3000个音乐节点。 连接他们的是16000人。 总共有300,000种关系。

我的问题是:

  1. 难道我做错了什么? 有一个更好的方法吗? 我是neo4j的新手。 我尝试了一些调整neo4j graphDB的技术。 我已将最小堆大小增加到4 GB,并在具有32 GB RAM的8核计算机上运行它。

  2. 我想知道关系rel1的强度以及rel2和rel3的数量。 Rel1具有财产实力。 我找不到它,

请提出建议,因为我即将放弃neo4j并返回到SQL。 至少可以正常工作。 :(

Regito,Paritosh

密码很慢。 与遍历和核心API相比,实际上非常慢( http://java.dzone.com/articles/get-full-neo4j-power-using

就是说,您可以尝试通过将Match拆分为不同的WITH子句来限制neo4j进程的节点数量。 例如,根据您的用例,您可以将root- [rel1:affinity * .. 3]-(电影)放在单独的子句中,并过滤出不同的电影。 其他neo4j将处理通往电影的所有路径组合。

PS:

WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books"

可以改写成

WHERE movies.type! = "movies" and persons.type! = "person" and books.type! = "books"

或者,如果您使用的是neo4j 2.0.0M4,则可以跳过HAS()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM