我是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 *
这里,我有三个父节点: 1.Presentation Layer 2.Business Layer 3.数据层
我想为每个父节点准确地显示50个子节点。但是当我使用限制时,它不限制特定父节点的节点数(但要显示的行数)并随机显示图形。每个父节点都具有以下类型的关系:CONTAINS与子节点和每个父节点的子节点数大于100。 是否可以将子节点限制为特定数量,对于每个父节点即可。每个父节点应显示50个子节点。 我们可以用密码查询来做 在此先感谢!!!!
答案 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