neo4j(密码)非常慢

时间:2013-08-30 01:01:49

标签: neo4j cypher

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

我有不同实体(电影,书籍,音乐等)的数据。为每个项目创建节点,其中属性为项目名称(电影名称,书籍等)和项目的实体类型(电影,书籍等)。任何两个节点之间都有称为“亲和力”的关系。这种关系也有一个“强度”属性,等于no。那些喜欢这两个项目的人。

我使用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拥有物业实力。我无法找到它,

  3. 请告知我,我即将放弃neo4j并回到SQL。至少它有效。 :(

    Regds, Paritosh

1 个答案:

答案 0 :(得分:0)

Cypher很慢。与遍历和核心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()