Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/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
Neo4j-不适当的匹配计数_Neo4j_Cypher_Query Performance - Fatal编程技术网

Neo4j-不适当的匹配计数

Neo4j-不适当的匹配计数,neo4j,cypher,query-performance,Neo4j,Cypher,Query Performance,我用两种不同的方法做x手术。但在第二种方法中,匹配查询的计数不合适,这是不可接受的。请指出我失踪的地方 第一种方式: profile WITH [1234] AS sellers_list, [12345] AS buyers_list MATCH (buyer:Person) WHERE buyer.person_guid IN buyers_list MATCH (seller:Person) WHERE seller.person_guid IN sellers_list RETURN

我用两种不同的方法做x手术。但在第二种方法中,匹配查询的计数不合适,这是不可接受的。请指出我失踪的地方

第一种方式:

profile
WITH [1234] AS sellers_list,
[12345] AS buyers_list

MATCH (buyer:Person) WHERE buyer.person_guid IN buyers_list
MATCH (seller:Person) WHERE seller.person_guid IN sellers_list

RETURN count(buyer),size(buyers_list),count(seller),size(sellers_list)
这导致:

第二种方式

profile
WITH [1234] AS sellers_list,
[12345] AS buyers_list

MATCH (seller_member:Person)-[r:TEAM_MEMBER]-(seller_teammate:Person) 
    WHERE seller_member.person_guid IN sellers_list

WITH FILTER(x IN COLLECT(seller_teammate.person_guid) WHERE NOT(x in sellers_list)) AS sellerteam, sellers_list, buyers_list

MATCH (seller_member:Person)-[r:EMPLOYED_BY]->(b:Organization)
MATCH (b)<-[s:EMPLOYED_BY]-(org_member:Person) 
    WHERE seller_member.person_guid=sellers[0]

WITH FILTER(x IN COLLECT(org_member.person_guid) WHERE NOT(x IN sellerteam)) AS org_members,sellers_list,sellerteam,buyers_list 

WITH sellers+sellerteam+org_members AS all_org_members,sellers_list,sellerteam,org_members,buyers_list


MATCH (buyer:Person) WHERE buyer.person_guid IN buyers_list
MATCH (seller:Person) WHERE seller.person_guid IN all_org_members

RETURN count(buyer),size(buyers_list),count(seller),size(sellers_list)
profile
以[1234]作为卖家列表,
[12345]作为买家名单
比赛(卖方成员:人)-[r:团队成员]-(卖方队友:人)
其中sellers\u member.person\u guid位于sellers\u列表中
将过滤器(收集中的x(卖方团队成员.人员guid)中的x(卖方列表中的x))作为卖方团队,卖方列表,买方列表
匹配(卖方\成员:个人)-[r:雇佣人]->(b:组织)

匹配(b)需要记住的一件关键事情是,Neo4j中的查询会建立行和列。当您在断开连接的模式之间执行匹配时,您往往会得到针对当前行的笛卡尔乘积(您可以在查询计划中看到这一点)。也就是说,笛卡尔积不一定是错误或坏的。如果没有笛卡尔积,就无法与guid列表中的所有卖家进行匹配,而且它只是针对您的单行的笛卡尔积

如果在卖家匹配后立即返回所有值,您将看到每一行都有不同的卖家,但所有其他字段(包括买家)都是相同的

您需要获得不同值的计数,
count(distinct-buyer)
,这将使您的预期买家计数为1

对于90k命中率,NodeUniqueIndexSeek每次查找需要2 db命中率,而您对45k值执行了查找,因此数学计算是正确的

编辑

如果您仍然怀疑,您可以单独尝试一个大型的唯一查找(或者在必须首先查找45k guid时尽可能多地进行隔离)


有没有其他方法可以减少dbhits以优化查询?一个独特的查找是2 db hits。减少数据库命中率的唯一方法是减少正在执行的查找次数。也就是说,独特的查找往往非常快,这些通常不是性能问题的根源。你正在做一些相当繁重的收集操作和合并。这些有时可能会有问题,我会先看一下。我添加了一个建议,用于检查收集节点属性的时间,以及从GUID匹配到节点的时间。顺便问一下,您使用guid而不是节点本身有什么原因吗?属性访问可能很昂贵,您可以跳过从GUID到节点的匹配。同意,我正在尝试使用节点而不是属性。收集guid没有具体的原因。
MATCH (p:Person)
WITH p LIMIT 45000
WITH COLLECT(p.person_guid) as guids
// you can always take the above subquery, returning 1, to see the timing of just collecting guids
MATCH (p:Person)
WHERE p.person_guid in guids
RETURN COUNT(p) as count