首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cypher查询循环

Cypher查询循环
EN

Stack Overflow用户
提问于 2019-02-28 03:12:33
回答 1查看 244关注 0票数 2

我对新4j/塞弗有一些麻烦。例如,这个查询:

代码语言:javascript
复制
MATCH
    (n71613:Concept)-[r0:similarTo]->(n5230:Concept),
    (n5230:Concept)-[r1:similarTo]->(n90576:Concept),
    (n5230:Concept)-[r2:similarTo]->(n121858:Concept),
    (n5230:Concept)-[r3:similarTo]->(n126486:Concept),
    (n126486)-[r:similarTo]->(child:Concept)
WHERE
    (child <> n90576
    AND child <> n121858
    AND child <> n126486
    AND child <> n71613
    AND child <> n5230)
AND
    (n90576 <> n121858
    AND n90576 <> n126486
    AND n90576 <> n71613
    AND n90576 <> n5230
    AND n121858 <> n126486
    AND n121858 <> n71613
    AND n121858 <> n5230
    AND n126486 <> n71613
    AND n126486 <> n5230
    AND n71613 <> n5230)
RETURN *
LIMIT 1

有一个所谓的无止境的循环,同时像这样运行它却没有:

代码语言:javascript
复制
MATCH
    (n71613:Concept)-[r0:similarTo]->(n5230:Concept),
    (n5230:Concept)-[r1:similarTo]->(n90576:Concept),
    (n5230:Concept)-[r2:similarTo]->(n121858:Concept),
    (n5230:Concept)-[r3:similarTo]->(n126486:Concept),
    (n126486)-[r:similarTo]->(child)
WHERE
    ('Concept' IN labels(child))
AND
    (child <> n90576
    AND child <> n121858
    AND child <> n126486
    AND child <> n71613
    AND child <> n5230)
AND
    (n90576 <> n121858
    AND n90576 <> n126486
    AND n90576 <> n71613
    AND n90576 <> n5230
    AND n121858 <> n126486
    AND n121858 <> n71613
    AND n121858 <> n5230
    AND n126486 <> n71613
    AND n126486 <> n5230
    AND n71613 <> n5230)
RETURN *
LIMIT 1

我真的不知道这是怎么回事,我靠运气找到了解决办法。

所以,过了一段时间,我又遇到了无穷无尽的循环问题。几乎相同的查询,但另一种模式:

代码语言:javascript
复制
MATCH
    (n0:Company)-[r0:produced]->(n1:Document),
    (n0:Company)-[r1:produced]->(n2:Document),
    (n0:Company)-[r2:produced]->(n3:Document),
    (n0:Company)-[r3:produced]->(n4:Document),
    (n0:Company)-[r4:produced]->(n5:Document),
    (n0)-[r:produced]->(child)
WHERE
    ((child <> n0) AND (child <> n1) AND (child <> n2) AND (child <> n3) AND (child <> n4) AND (child <> n5))
AND
    ((n0 <> n1) AND (n0 <> n2) AND (n0 <> n3) AND (n0 <> n4) AND (n0 <> n5) AND (n1 <> n2) AND (n1 <> n3) AND (n1 <> n4) AND (n1 <> n5) AND (n2 <> n3) AND (n2 <> n4) AND (n2 <> n5) AND (n3 <> n4) AND (n3 <> n5) AND (n4 <> n5))
AND
    ('Document' IN labels(child))
RETURN n0 AS n0_0, r0, n1 AS n1_0, n0 AS n0_1, r1, n2 AS n2_1, n0 AS n0_2, r2, n3 AS n3_2, n0 AS n0_3, r3, n4 AS n4_3, n0 AS n0_4, r4, n5 AS n5_4, n0 AS parent, r, child
LIMIT 1

导致另一个所谓的无止境循环,我碰巧通过这样做“克服”了这个循环:

代码语言:javascript
复制
MATCH
    (n0:Company)-[r0:produced]->(n1:Document),
    (n0:Company)-[r1:produced]->(n2:Document),
    (n0:Company)-[r2:produced]->(n3:Document),
    (n0:Company)-[r3:produced]->(n4:Document),
    (n0:Company)-[r4:produced]->(n5:Document)
WHERE 
    ((n0 <> n1) AND (n0 <> n2) AND (n0 <> n3) AND (n0 <> n4) AND (n0 <> n5) AND (n1 <> n2) AND (n1 <> n3) AND (n1 <> n4) AND (n1 <> n5) AND (n2 <> n3) AND (n2 <> n4) AND (n2 <> n5) AND (n3 <> n4) AND (n3 <> n5) AND (n4 <> n5))
OPTIONAL MATCH
    (n0)-[r:produced]->(child:Document)
WITH *
WHERE
    (r IS NOT NULL)
AND
    ((child <> n0) AND (child <> n1) AND (child <> n2) AND (child <> n3) AND (child <> n4) AND (child <> n5))
RETURN n0 AS n0_0, r0, n1 AS n1_0, n0 AS n0_1, r1, n2 AS n2_1, n0 AS n0_2, r2, n3 AS n3_2, n0 AS n0_3, r3, n4 AS n4_3, n0 AS n0_4, r4, n5 AS n5_4, n0 AS parent, r, child
LIMIT 1

但是,对于第一个模式(我发布的第一个查询),这个查询会导致一个没完没了的循环(不,甚至连让它工作的“标签()”技巧都没有)。

我只需要一种快速进行模式匹配的方法,而不必因为明显的原因而更改查询。

我真的不明白这是怎么回事,我希望你能穿点光,帮我一把。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 03:45:30

您正在重复匹配相同的模式,并创建一个笛卡尔产品。

不要编写多个匹配,只使用一个。我不清楚你想实现什么,如果你能分享细节,我可以建议你如何写查询它。

编辑:尝试如下:

代码语言:javascript
复制
MATCH (n:Company)-[r:produced]->(m:Document) 
WITH n, COLLECT(DISTINCT m) as ms
WHERE size(ms) = 6 
MATCH (n:Company)-[r:produced]->(m:Document) 
RETURN n, r, m 
LIMIT 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54917845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档