neo4j(cypher)非常慢

neo4j(cypher)非常慢,neo4j,cypher,Neo4j,Cypher,我正在尝试建立一个Facebook上人们喜欢的不同实体的图表,以创建一个基本的跨域推荐引擎 我有不同实体(电影、书籍、音乐等)的数据。为每个项目创建节点,属性为项目名称(电影、书籍等的名称)和项目的实体类型(电影、书籍等)。任何两个节点之间都有称为“关联”的关系。这种关系也有一个“强度”属性,等于喜欢这两项的人数 我使用FB用户连接这些节点。FB用户也是图中的节点,其属性为人名,类型为人名。这些节点和项目节点之间的关系称为“likes”。现在,如果一个人喜欢一部电影,我想通过遍历图表向他推荐书籍

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

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

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

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
START root=node()
匹配p=root-[rel1:affinity*.3](电影)(书籍)
其中HAS(movies.type)和movies.type=“movies”,HAS(persons.type)和persons.type=“person”,HAS(books.type)和books.type=“books”
还书
这运行速度非常慢,有时长达500秒。我有大约13000部电影,2000本书和3000个音乐节点。连接他们的是16000人。总共有大约300000个关系

我的问题是:

  • 我做错什么了吗?有更好的方法吗? 我是neo4j的新手。我尝试了一些调整neo4j graphDB的技术。我已经将最小堆大小增加到4GB,并在一台有32GB内存的8核机器上运行它

  • 我想知道关系rel1的强度以及rel2和rel3的数量。Rel1具有属性强度。我找不到它

  • 请给出建议,因为我即将放弃neo4j并返回SQL。至少它起作用了(

    Regds,
    Paritosh的速度很慢。与遍历和核心API相比,实际上非常慢()

    也就是说,您可以尝试通过将匹配项拆分为不同的WITH子句来限制neo4j进程的节点数量 root-[rel1:affinity*.3](movies)在一个单独的子句中,并过滤掉不同的movies。否则,neo4j将处理导致一个movie的所有路径组合

    附言:

    可以重写为

    WHERE movies.type! = "movies" and persons.type! = "person" and books.type! = "books"
    
    或者,如果您使用的是neo4j 2.0.0M4,您可以跳过HAS()

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