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