如何在neo4j中将子节点限制为特定的数字

时间:2018-01-08 05:20:10

标签: graph neo4j cypher

我是neo4j的新手,并且陷入一个非常奇怪的问题来限制特定父节点的子节点。请看一下我写的查询:

MATCH (l:Presentation_Layer)-[c:CONTAINS]-(o) 
MATCH (l1:Business_Layer)-[r:CONTAINS]-(o1:Object)
MATCH (l2:Data_Layer)-[r2:CONTAINS]-(o2:Object)
WITH l,l1,l2,c,r,r2,o,o1,o2 LIMIT 100
OPTIONAL MATCH(l3:Layer)-[d:REFERENCES]-(l4:Layer)
RETURN *

结果如下:(参见截图)enter image description here

这里,我有三个父节点: 1.Presentation Layer 2.Business Layer 3.数据层

我想为每个父节点准确地显示50个子节点。但是当我使用限制时,它不限制特定父节点的节点数(但要显示的行数)并随机显示图形。每个父节点都具有以下类型的关系:CONTAINS与子节点和每个父节点的子节点数大于100。 是否可以将子节点限制为特定数量,对于每个父节点即可。每个父节点应显示50个子节点。 我们可以用密码查询来做 在此先感谢!!!!

1 个答案:

答案 0 :(得分:1)

LIMIT不适用于MATCH的结果,它适用于返回的总记录/行。

这是关于如何limit the results of a match per row的知识库文章。

诀窍是将所有父节点放在一个变量下,您应该能够在WHERE子句上使用所需标签上的OR逻辑。

以下是使用apoc.cypher.run()方法的示例:

MATCH (n)
WHERE n:Presentation_Layer OR n:Business_Layer OR n:Data_Layer
CALL apoc.cypher.run("
  MATCH (n)-[r:CONTAINS]-(o) 
  RETURN n, r, o 
  LIMIT 50", 
  {n:n}) YIELD value
RETURN value.n, value.r, value.o

修改

如果需要所有给定父节点之间的关系,可以使用APOC过程,但是您需要将父节点ID的集合传递给它。以下是您可以这样做的一种方式:

MATCH (n)
WHERE n:Presentation_Layer OR n:Business_Layer OR n:Data_Layer
WITH collect(n) as parents, collect(id(n)) as ids
CALL apoc.algo.cover(ids) YIELD rel
WITH parents, collect(rel) as parentRels
UNWIND parents as n
CALL apoc.cypher.run("
  MATCH (n)-[r:CONTAINS]-(o) 
  RETURN n, r, o 
  LIMIT 50", 
  {n:n}) YIELD value
RETURN value.n, value.r, value.o, parentRels