我正在尝试构建 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 个关系。
我的问题是:
难道我做错了什么?有一个更好的方法吗?我是neo4j的新手。我已经尝试了一些调整 neo4j graphDB 的技术。我已将最小堆大小增加到 4 GB,并在具有 32 GB RAM 的 8 核机器上运行它。
我想知道关系 rel1 的强度以及 rel2 和 rel3 的数量。Rel1 具有属性强度。我查不出来,
请告知,因为我即将放弃 neo4j 并返回 SQL。至少它有效。:(
Regds,帕里托什