【问题标题】:Neo4J: query optimisation/model validationNeo4J:查询优化/模型验证
【发布时间】:2018-07-04 00:30:04
【问题描述】:

Neo4J 新手,如果我做错了事,请提前道歉。我正在尝试根据他们选择的类别和他们独立喜欢的标签来展示他们可能感兴趣的用户文章。 我在 Neo4j 中的模型是这样的

(:USER)-[:LIKES]->(:TAG)
(:ARTICLE)-[:PUBLISHED_BY]->(:PROVIDER)
(:ARTICLE)-[:HAS_CATEGORY]->(:CATEGORY)
(:USER)-[:DISLIKES]-(:ARTICLE)
(:USER)-[:INTERESTED_IN]->(:CATEGORY)

当我尝试运行以下查询以获得所需的结果时......我得到了它们,但查询需要 16-18 秒才能执行。

MATCH (u:USER {id: $userid})-[:LIKES]->(t:TAG) 
WITH u,t, collect(t.name) as tags 
UNWIND tags as tag with u,tag 
MATCH (c:CATEGORY)<-[*]-(a:ARTICLE)-[pub:PUBLISHED_BY]->(p:PROVIDER) 
WHERE a.keywords contains tag OR c.id in $categoryArray 
  AND NOT (u)-[:DISLIKES]->(a) 
RETURN DISTINCT a.id AS id, a.title AS title, pub.pubDate 
ORDER BY pub.pubDate DESC LIMIT 250

有没有更快更好的方法来获得想要的结果? 注意:我在 ubuntu 机器上使用 Neo4j 3.4.1 版本,页面缓存:512mb,最小和最大堆大小:1500mb

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    如果你的模型中的文章连接到标签会更好。

    此位:a.keywords contains tag 不支持索引,因此会导致全扫描。

    另外,从类别到文章可能是一个长链,所以在那里添加一个 rel-type 并添加一个上限。根据类别检查找到的文章可能会更好。

    MATCH (u:USER {id: $userid})-[:LIKES]->(tag:TAG) 
    MATCH (a:ARTICLE)-[:HAS_TAG]->(tag)
    WITH distinct u, a
    WHERE any(c IN categories WHERE NOT shortestPath((c)<-[:IN_CATEGORY*]-(a)) IS NULL)
      AND NOT (u)-[:DISLIKES]->(a) 
    MATCH (a)-[pub:PUBLISHED_BY]->(p:PROVIDER) 
    RETURN DISTINCT a.id AS id, a.title AS title, pub.pubDate 
    ORDER BY pub.pubDate DESC LIMIT 250
    

    还可以使用PROFILE 检查查询计划以查看任何瓶颈或未索引字段(您可以使用右下角的双箭头展开框)

    【讨论】:

      【解决方案2】:

      感谢@Michael,我知道将标签作为与文章相关的单独节点会使搜索速度更快,但以下查询目前已将搜索时间从 16-18 秒缩短到 3-4 秒

      MATCH (u:USER {id: $userId})-[:INTERESTED_IN]->(c:CATEGORY)<-[*]-(a:ARTICLE)[pub:PUBLISHED_BY]->(p:PROVIDER) WHERE NOT (u)-[:DISLIKES]->(a) RETURN DISTINCT a.id, a.title, pub.pubDate ORDER BY pub.pubDate DESC LIMIT 150 UNION MATCH (u:USER {id: $userId})-[:LIKES]->(t:TAG) WITH u, t, collect(t.name) AS tags UNWIND tags AS tag MATCH (a:ARTICLE)-[pub:PUBLISHED_BY]-(:PROVIDER) WHERE a.keywords CONTAINS tag AND NOT (u)-[:DISLIKES]->(a) RETURN DISTINCT a.id, a.title, pub.pubDate ORDER BY pub.pubDate DESC LIMIT 150
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多