Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 排序和选择-Neo4j中的按子句排序和不同操作较慢_Performance_Neo4j_Cypher - Fatal编程技术网

Performance 排序和选择-Neo4j中的按子句排序和不同操作较慢

Performance 排序和选择-Neo4j中的按子句排序和不同操作较慢,performance,neo4j,cypher,Performance,Neo4j,Cypher,我试图用Neo4j中的ORDERBY子句返回前5名得分手。不幸的是,由于记录数超过500K,排序操作比预期慢得多 有没有其他方法可以让我在几秒钟内更快地返回前5名得分手 我的问题是: WITH [23,232,143,843,34,35,980,529,489,378] AS sellers, ['a26','762','e2c','6b57','369','aa10','6ba5','b9a','aa03','d3fd'] AS buyers

我试图用Neo4j中的ORDERBY子句返回前5名得分手。不幸的是,由于记录数超过500K,排序操作比预期慢得多

有没有其他方法可以让我在几秒钟内更快地返回前5名得分手

我的问题是:

        WITH [23,232,143,843,34,35,980,529,489,378] AS sellers,
        ['a26','762','e2c','6b57','369','aa10','6ba5','b9a','aa03','d3fd'] AS buyers

        MATCH (org:Organization{org_guid:'5de2c1'})-[:EMP_BY]-(org_member:Person)

        MATCH (seller:Person) WHERE seller.person_guid IN sellers
        MATCH (buyer:Person) WHERE buyer.person_guid IN buyers

        MATCH (seller)-[:TEAM_MEMBER]-(sellerteam:Person)

        OPTIONAL MATCH (org_member)-[p:P2P]-(buyer)-[q:EMP_BY]-(:Organization)
        WITH CASE
             WHEN (p IS NOT NULL AND q is NOT NULL AND org_member IN collect(sellers)) THEN p.strength*q.influence
             WHEN (p IS NOT NULL AND q is NOT NULL AND org_member IN collect(sellerteam)) THEN p.strength*q.influence*0.6
             WHEN (p IS NOT NULL AND q is NOT NULL ) THEN p.strength*q.influence*0.3
             WHEN (p IS NOT NULL AND q is NULL AND org_member IN collect(sellers)) THEN p.strength*0.7
             WHEN (p IS NOT NULL AND q is NULL AND org_member IN collect(sellerteam)) THEN p.strength*0.7*0.6
             WHEN (p IS NOT NULL AND q is NULL ) THEN p.strength*0.7*0.3
             WHEN (p IS NULL AND q IS NOT NULL) THEN q.influence*0.3
             ELSE 0
          END AS score,buyer
        RETURN DISTINCT buyer.person_guid,score ORDER BY score LIMIT 5
根据命令条款:

Returned 5 rows in 345255 ms.
Returned 5 rows in 148240 ms.
在没有第条命令的情况下:

Returned 5 rows in 345255 ms.
Returned 5 rows in 148240 ms.
个人资料图像:

统计数字:

org_mermber: 45k
team_member: 700+
sellers    : 10
Buyers     : 10

由于每个买家都有分数,我使用的是DISTINCT和ORDERBY。如何加速此查询?

感谢您添加完整查询

首先,您在案例陈述中每行收集了大量数据。最好在查询的早期进行收集,最好在查询中生成许多行的部分之前进行收集

我们还可以对查询的某些部分重新排序,以获得更好的性能

此外,该组织中似乎有大约43396人,因此,与其收集这些人以便稍后在in检查中使用,不如稍后在查询中检查是否存在与该组织的关系

让我们看看这能不能把事情弄清楚。这是一个非常复杂的查询,因此我们可能需要对错误进行故障排除,但通过扩展到org_成员,它应该可以绕过原始查询中的瓶颈

    // first let's get collections of all sellers and sellerteams

    WITH [23,232,143,843,34,35,980,529,489,378] AS sellers
    MATCH (seller:Person) WHERE seller.person_guid IN sellers

    // COLLECT then UNWIND so we keep all sellers in a collection
    // even as we match seller to seller_team
    WITH COLLECT(seller) as sellers
    UNWIND sellers as seller
    MATCH (seller)-[:TEAM_MEMBER]-(seller_team:Person)

    WITH sellers, COLLECT(seller_team) as sellerteam
    // since all elements are collections, only 1 row built up

    MATCH (org:Organization{org_guid:'5de2c1'})
    WITH sellers, sellerteam, org,
     ['a26','762','e2c','6b57','369','aa10','6ba5','b9a','aa03','d3fd'] AS buyers
    MATCH (buyer:Person) WHERE buyer.person_guid IN buyers

    WITH sellers, sellerteam, org, buyer

    // let's break the big optional match in 2
    OPTIONAL MATCH (buyer)-[q:EMP_BY]-(:Organization)

    // save q.influence (with a default); save whether q is null for later
    WITH sellers, sellerteam, org, buyer, COALESCE(q.influence, 0.7) as qInfluence, q is NULL as qNull

    // other half of the big optional match, should be less expensive
    // to ensure org_member is an organization member this way
    OPTIONAL MATCH (org_member)-[p:P2P]-(buyer)
    WHERE (org_member)-[:EMP_BY]-(org)

    // save p.strength (with a default); save whether p is null for later
    // save whether org_member is a seller or on the sellerteam
    WITH sellers, sellerteam, buyer, qInfluence, qNull, COALESCE(p.strength, 1.0) as pStrength, 
    p is NULL as pNull, org_member in sellers as sellerMember, org_member in sellerteam as teamMember

    WITH buyer, qInfluence, pStrength, 
      CASE WHEN pNull and qNull THEN 0.0
           WHEN sellerMember    THEN 1.0
           WHEN teamMember      THEN 0.6 
                                ELSE 0.3
      END as memberMultiplier
    WITH DISTINCT buyer, qInfluence * pStrength * memberMultiplier as score
    ORDER BY score DESC LIMIT 5
    RETURN buyer.person_guid, score 

您是否对:Person(Person\u guid)和:Organization(org\u guid)有唯一的约束?另外,您能为这个查询创建一个概要文件,展开概要文件的所有元素,并在您的描述中粘贴一个它的图像吗?是的,我在这两个方面都有索引。我对您的第一次匹配以及您的卖家对团队成员匹配的全部内容感到好奇,因为您似乎没有在以后的查询中使用任何涉及的变量。是否有理由保留这些?是的,在案例陈述中。如果卖家在团队成员中,则得分为*0.8,否则卖家在组织成员中,则得分为*0.5,卖家不在两者中,则得分为*1。(查询中的一个小变化)我认为您最好添加完整的查询,如果没有它,很难看到查询的各个部分如何相互关联。例如,据我所知,没有任何东西可以将卖家连接到买家查询,因此在您提出的查询中,它是无用的。没有上下文,就很难给出关于如何优化的好建议。