Neo4j 密码查询无限循环

Neo4j 密码查询无限循环,neo4j,cypher,Neo4j,Cypher,我和neo4j/cypher有点问题。 例如,此查询: MATCH (n71613:Concept)-[r0:similarTo]->(n5230:Concept), (n5230:Concept)-[r1:similarTo]->(n90576:Concept), (n5230:Concept)-[r2:similarTo]->(n121858:Concept), (n5230:Concept)-[r3:similarTo]->(n126

我和neo4j/cypher有点问题。 例如,此查询:

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
匹配
(n71613:概念)-[r0:类似]->(n5230:概念),
(n5230:概念)-(r1:类似]->(n90576:概念),
(n5230:概念)-[r2:类似]->(n121858:概念),
(n5230:概念)-(r3:类似]->(n126486:概念),
(n126486)-[r:Similato]->(子:概念)
哪里
(儿童n90576)
和儿童N12158
和儿童n126486
和儿童n71613
和儿童(n5230)
及
(n90576 N12158
和n90576 n126486
和n90576 n71613
和n90576 n5230
和n121858 n126486
和n121858 n71613
和N12158N5230
和n126486 n71613
和n126486 n5230
和n71613(n5230)
返回*
限制1
在所谓的无休止的循环中, 同时,像这样运行它不会:

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
匹配
(n71613:概念)-[r0:类似]->(n5230:概念),
(n5230:概念)-(r1:类似]->(n90576:概念),
(n5230:概念)-[r2:类似]->(n121858:概念),
(n5230:概念)-(r3:类似]->(n126486:概念),
(n126486)-[r:Similato]->(儿童)
哪里
(“概念”在标签中(子项))
及
(儿童n90576)
和儿童N12158
和儿童n126486
和儿童n71613
和儿童(n5230)
及
(n90576 N12158
和n90576 n126486
和n90576 n71613
和n90576 n5230
和n121858 n126486
和n121858 n71613
和N12158N5230
和n126486 n71613
和n126486 n5230
和n71613(n5230)
返回*
限制1
我真的不知道这里发生了什么, 我完全是靠运气找到了解决办法

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

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
匹配
(n0:公司)-[r0:生产]->(n1:文件),
(n0:公司)-[r1:生产]->(n2:文件),
(n0:公司)-(r2:已生产]->(n3:文件),
(n0:公司)-[r3:生产]->(n4:文件),
(n0:公司)-[r4:生产]->(n5:文件),
(n0)-[r:产生]->(子项)
哪里
((儿童n0)和(儿童n1)和(儿童n2)和(儿童n3)和(儿童n4)和(儿童n5))
及
((n0 n1)和(n0 n2)和(n0 n3)和(n0 n4)和(n0 n5)和(n1 n3)和(n1 n4)和(n1 n5)和(n2 n3)和(n2 n4)和(n2 n5)和(n3 n4)和(n4 n5))
及
(“文档”在标签中(子项))
返回n0作为n0\u 0,r0,n1作为n1\u 0,n0作为n0\u 1,r1,n2作为n2\u 1,n0作为n0\u 2,r2,n3作为n3\u 2,n0作为n0\u 3,r3,n4作为n4\u 3,n0作为n0\u 4,r4,n5作为n5\u 4,n0作为父项,r,子项
限制1
导致另一个所谓的无止境循环, 我碰巧通过这样做“克服”了:

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
匹配
(n0:公司)-[r0:生产]->(n1:文件),
(n0:公司)-[r1:生产]->(n2:文件),
(n0:公司)-(r2:已生产]->(n3:文件),
(n0:公司)-[r3:生产]->(n4:文件),
(n0:公司)-(r4:生产]->(n5:文件)
哪里
((n0 n1)和(n0 n2)和(n0 n3)和(n0 n4)和(n0 n5)和(n1 n3)和(n1 n4)和(n1 n5)和(n2 n3)和(n2 n4)和(n2 n5)和(n3 n4)和(n4 n5))
选配
(n0)-[r:生成]->(子项:文档)
与*
哪里
(r不为空)
及
((儿童n0)和(儿童n1)和(儿童n2)和(儿童n3)和(儿童n4)和(儿童n5))
返回n0作为n0\u 0,r0,n1作为n1\u 0,n0作为n0\u 1,r1,n2作为n2\u 1,n0作为n0\u 2,r2,n3作为n3\u 2,n0作为n0\u 3,r3,n4作为n4\u 3,n0作为n0\u 4,r4,n5作为n5\u 4,n0作为父项,r,子项
限制1
但是这个查询导致了第一个模式(我发布的第一个查询)的无休止的循环(不,甚至连“labels()”技巧都不能让它工作)

我只需要一种快速进行模式匹配的方法,而无需出于明显的原因更改查询

我真的不明白这里发生了什么, 我希望你能帮我点忙


谢谢

您正在重复匹配相同的模式,并创建笛卡尔积

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

编辑: 试试这个:

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

请分享更多详细信息,如您试图对此查询执行什么操作?您的意思是在后一个查询中?我只是想检查一个有根节点(n0)的子图是否有6个输出链接(6个不同的节点)如其中一个答案所述,我不认为这是一个“无止境的循环”,而是重复模式匹配导致的一个大笛卡尔积。我不这么认为,我需要检查我的数据库中是否存在相同的子图。事实上,将n0匹配到n5非常快,但是添加“子”节点会让它有点“无止境”。我真的不明白为什么。有没有其他方法可以检查db中是否存在路径?因此,如果节点具有指定关系类型的期望超出度,这还不够好。。。因为关系可能会转到不需要的节点。。。因为相同的关系类型可能会在两个节点之间出现多次?如果我只写了一个匹配,我就不会得到我希望的结果,那就是一个带有根节点和6个不同6个节点的传出链接的图。您是否有来自根节点和其他节点的多个传出链接?我的意思是根和一个特定节点之间的多个链接?只对6个节点感兴趣吗?如果链接的数量较少/较多,如4,5或7,9等,该怎么办?是的,根节点可能对一个节点有不同的链接类型。我感兴趣的是精确匹配6个节点(或者说N个固定节点),而不是少一个或多一个。您应该找到连接到特定关系类型的根节点的不同节点数(此处为“生成”),并且仅当计数精确为6时才进行筛选。