Neo4j:集合中的WHERE子句ID(节点)
以下密码查询执行速度非常慢。它的外形看起来不错——有人能指出我做错了什么吗。它应该根据运行每个部分所需的时间快速返回Neo4j:集合中的WHERE子句ID(节点),neo4j,Neo4j,以下密码查询执行速度非常慢。它的外形看起来不错——有人能指出我做错了什么吗。它应该根据运行每个部分所需的时间快速返回 PROFILE MATCH (deal2:lDeal) <-[tr2:PARTICIPATES_IN]- (frComp:lCompany { id:2353462}) //1944 rows MATCH (inter) -[tr1:WORKED_IN | PARTICIPATES_IN]-> (deal2) //58,373 WITH c
PROFILE
MATCH
(deal2:lDeal) <-[tr2:PARTICIPATES_IN]- (frComp:lCompany { id:2353462}) //1944 rows
MATCH
(inter) -[tr1:WORKED_IN | PARTICIPATES_IN]-> (deal2) //58,373
WITH
collect(distinct id(inter)) as interCol
MATCH
(article:lArticle { articleId:13194153}) -[r:WRITTEN_ABOUT] -> (Comp1:lCompany)
MATCH
(Comp1) -[fr1:PARTICIPATES_IN]-> (deal1:lDeal) //6671
MATCH
(deal1) <-[fr2:WORKED_IN | PARTICIPATES_IN]- (inter) //135,011
WHERE
id(inter) in interCol
RETURN
inter
PROFILE
匹配
(deal2:lDeal)(deal2)//58373
具有
将(不同id(inter))收集为intercl
匹配
(article:lArticle{articleId:13194153})->(公司1:L公司)
匹配
(Comp1)-[fr1:参与]->(deal1:lDeal)//6671
匹配
(deal1)(deal2:lDeal)(deal1:lDeal)
具有
独特交易1
匹配
deal1要优化查询,我会将其分解为多个部分并进行优化。如果不了解你的领域,就很难给出明确的建议。如果您在网站上共享一个小样本,可能会有所帮助。除了领域理解之外,我还要看两件事
1) 在路径上进行过滤比在交叉点上进行匹配更好
如果我理解您的查询,您将匹配两个不同路径上的两组节点,它们来自两个不同的单独起点,然后返回这些结果的交点。您的查询的人工重建可能是
请告诉我该公司参与的所有交易,或者更确切地说,所有参与或参与这些交易的利益相关者的情况(只告诉我一次)。
我还写了一篇关于一家或多家公司的文章,我想了解参与或参与这些公司参与的任何交易的所有利益相关者。
只是开玩笑,我不想知道所有这些利益相关者(联盟),只想知道那些发生在两条道路(交叉点)上的利益相关者
<>如果这至少是一个公平的重建,那么你可以考虑把你的查询改写为“”之类的东西。
请告知参与本公司参与的任何交易的所有利益相关者
如果他们也参与或参与了本文中提到的一家或多家公司参与的交易
这可能被翻译回Cypher作为
MATCH (inter)-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)-[:PARTICIPATES_IN]->(:lCompany {id:2353462})
WHERE inter-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(:lArticle {articleId:13194153})
及
不同之处在于,第一个查询具有单独的MATCH
子句,允许重用第一个查询中匹配的关系,因此比第二个查询具有更多的匹配项。您可以在手册中的网站上阅读
上面建议的查询,将所有匹配都拉到一个MATCH
子句中,如果确实是导致效率低下的原因,也会解决这个问题
*)标识符
使用上面我的查询建议中表示的模式,不再需要大多数标识符。我放弃这些,不是为了性能,而是因为我认为它使查询更具可读性,我想这也是一种效率。您尝试的是sql风格的连接
请尝试以下方法:
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany {id:2353462})
using index c:lCompany(id)
WITH distinct inter
MATCH inter-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(a:lArticle {articleId:13194153})
USING INDEX a:lArticle(articleId)
RETURN inter;
(与Ted合作)限制中间结果,以下是我们得出的最佳结果(15222毫秒内总db点击量为8354507次):
MATCH(comp2:lCompany{id:2353462})-[tr2:participations\u IN]->(deal2:lDeal)(deal1:lDeal)
以独特的方式1
MATCH Deal1我还没有消化所有这些,但我接受了你建议的查询,修复了你(:lDeal)-[:participations_IN]->(:lCompany{id:2353462})的打字错误,而不是(:lDeal)使用和distinct inter
Michael,我在原始问题中添加了你要求的两个配置文件。不幸的是,你给出的解决方案需要花费太长的时间来分析。还只是添加了我错过的计数。
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(cDeal:lDeal)
WHERE
cDeal<-[:PARTICIPATES_IN]-(:lCompany {id:2353462})
WITH
inter
MATCH
inter-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(:lArticle {articleId:13194153})
RETURN
inter
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(cDeal:lDeal)
WHERE
cDeal<-[:PARTICIPATES_IN]-(:lCompany {id:2353462})
WITH
inter
MATCH
inter-[:WORKED_IN|PARTICIPATES_IN]->(aDeal:lDeal)
WHERE
aDeal<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(:lArticle {articleId:13194153})
RETURN
inter
PROFILE
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(deal:lDeal)<-[:PARTICIPATES_IN]- (c:lCompany {id:2353462})
USING
index c:lCompany(id)
RETURN
count(*), count(distinct inter), count(distinct deal), count(distinct c);
PROFILE
MATCH
inter-[:WORKED_IN|PARTICIPATES_IN]->(deal:lDeal)<-[:PARTICIPATES_IN]-(c:lCompany)<-[:WRITTEN_ABOUT]-(a:lArticle {articleId:13194153})
USING
INDEX a:lArticle(articleId)
RETURN
count(*), count(distinct inter), count(distinct deal), count(distinct a), count(distinct c);
MATCH
(comp2:lCompany {id:2353462})-[tr2:PARTICIPATES_IN]->(deal2:lDeal)<-[tr1]-(inter)-[fr2]->(deal1:lDeal)
WITH
DISTINCT deal1
MATCH
deal1<-[fr1:PARTICIPATES_IN]-(comp1:lCompany)<-[r:WRITTEN_ABOUT]-(article:lArticle)
USING INDEX article:lArticle(articleId)
WHERE
article.articleId=13194153
RETURN
DISTINCT count(comp1) as count, comp1.id ,comp1.name order by count desc, comp1.name
MATCH (inter)-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)-[:PARTICIPATES_IN]->(:lCompany {id:2353462})
WHERE inter-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(:lArticle {articleId:13194153})
MATCH (n:Crew { name:"Neo" })-[:KNOWS|LOVES]->(m)
MATCH n-[:LOVES]->o
RETURN n,m,o
----
n m o
(0:Crew {name:"Neo"}) (1:Crew {name:"Morpheus"}) (2:Crew {name:"Trinity"})
(0:Crew {name:"Neo"}) (2:Crew {name:"Trinity"}) (2:Crew {name:"Trinity"})
MATCH (n:Crew { name:"Neo" })-[:KNOWS|LOVES]->(m), n-[:LOVES]->o
RETURN n,m,o
----
n m o
(0:Crew {name:"Neo"}) (1:Crew {name:"Morpheus"}) (2:Crew {name:"Trinity"})
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany {id:2353462})
using index c:lCompany(id)
WITH distinct inter
MATCH inter-[:WORKED_IN|PARTICIPATES_IN]->(:lDeal)<-[:PARTICIPATES_IN]-(:lCompany)<-[:WRITTEN_ABOUT]-(a:lArticle {articleId:13194153})
USING INDEX a:lArticle(articleId)
RETURN inter;
PROFILE
MATCH
(inter)-[:WORKED_IN|PARTICIPATES_IN]->(deal:lDeal)<-[:PARTICIPATES_IN]-(c:lCompany {id:2353462})
using index c:lCompany(id)
RETURN count(*), count(distinct inter), count(distinct deal), count(distinct c);
PROFILE
MATCH inter-[:WORKED_IN|PARTICIPATES_IN]->(deal:lDeal)<-[:PARTICIPATES_IN]-(c:lCompany)<-[:WRITTEN_ABOUT]-(a:lArticle {articleId:13194153})
USING INDEX a:lArticle(articleId)
RETURN count(*), count(distinct inter), count(distinct deal), count(distinct a), count(distinct c);
MATCH (comp2:lCompany {id:2353462})-[tr2:PARTICIPATES_IN]->(deal2:lDeal)<-[tr1]-(inter)
WITH DISTINCT inter
MATCH inter-[fr2]->(deal1:lDeal)
WITH DISTINCT deal1
MATCH deal1<-[fr1:PARTICIPATES_IN]-(comp1:lCompany)<-[r:WRITTEN_ABOUT]-(article:lArticle)
USING INDEX article:lArticle(articleId)
WHERE article.articleId=13194153
RETURN DISTINCT count(comp1) as count, comp1.id ,comp1.name order by count desc, comp1.name