neo4j-基于节点的限制查询';s级
我有一个节点的层次结构,所有节点都有一个自定义的排序属性(数字)。下面是一个要重新创建的简单密码查询:neo4j-基于节点的限制查询';s级,neo4j,cypher,Neo4j,Cypher,我有一个节点的层次结构,所有节点都有一个自定义的排序属性(数字)。下面是一个要重新创建的简单密码查询: merge (p {my_id: 1})-[:HAS_CHILD]->(c1 { my_id: 11, sort: 100}) merge (p)-[:HAS_CHILD]->(c2 { my_id: 12, sort: 200 }) merge (p)-[:HAS_CHILD]->(c3 { my_id: 13, sort: 300 }) merge (c1)-[:HAS_
merge (p {my_id: 1})-[:HAS_CHILD]->(c1 { my_id: 11, sort: 100})
merge (p)-[:HAS_CHILD]->(c2 { my_id: 12, sort: 200 })
merge (p)-[:HAS_CHILD]->(c3 { my_id: 13, sort: 300 })
merge (c1)-[:HAS_CHILD]->(cc1 { my_id: 111 })
merge (c2)-[:HAS_CHILD]->(cc2 { my_id: 121 })
merge (c3)-[:HAS_CHILD]->(cc3 { my_id: 131 });
我一直在努力解决的问题是,我经常需要根据子节点相对于某个父节点的排名来做出决策,并将regads设置为该排序标识符。因此,例如,节点c1
相对于节点p
具有排名1(因为它具有最少的sort
属性),c2
具有排名2,c3
具有排名3(最大的sort
)
我需要根据此信息做出的决策类型:仅显示前2个cX
节点的子节点。以下是我想要得到的:
cc1
和cc2
存在,但cc3
不是因为c3
(其父项)不是p
的第一个子项或第二个子项。这是一个愚蠢的问题:
match (p {my_id: 1 })-->(c)
optional match (c)-->(cc) where c.sort <= 200
return p, c, cc
下面是此查询的计划,最昂贵的部分实际上是size
表达式:
您看到的缓慢可能是因为您没有在查询中执行索引查找,因此它正在执行所有节点扫描,并访问图形中每个节点的
my\u id
属性,以查找id为1的节点(您的p
节点)
您需要在节点上添加标签,并在查询中使用这些标签(至少对于p
节点),并在my_id
的标签上创建索引(在本例中,可能是唯一的约束),以便快速查找
您可以通过对查询执行概要文件来确认发生了什么(如果您可以将概要文件计划添加到描述中,并扩展计划的所有元素,这将有助于确定进一步的优化)
对于您的查询,类似的东西应该可以工作(我使用:Node标签作为实际标签的替代)
请注意,这只返回节点,而不返回路径或关系。在图形视图中获得结果图的原因是,在浏览器设置选项卡(左下菜单中的齿轮图标)的底部选中了
Connect result nodes
您看到的缓慢可能是因为您没有在查询中执行索引查找,因此它正在执行所有节点扫描,并访问图形中每个节点的my_id
属性,以查找id为1的节点(您的p
节点)
您需要在节点上添加标签,并在查询中使用这些标签(至少对于p
节点),并在my_id
的标签上创建索引(在本例中,可能是唯一的约束),以便快速查找
您可以通过对查询执行概要文件来确认发生了什么(如果您可以将概要文件计划添加到描述中,并扩展计划的所有元素,这将有助于确定进一步的优化)
对于您的查询,类似的东西应该可以工作(我使用:Node标签作为实际标签的替代)
请注意,这只返回节点,而不返回路径或关系。在图形视图中获得结果图的原因是,在浏览器设置选项卡(左下菜单中的齿轮图标)的底部选中了
Connect result nodes
非常感谢您的回复,我已经在我的问题中添加了分析计划。事实上,正如您在计划中看到的那样,实际数据库需要索引和标签,而计划中最昂贵的部分实际上是带有size的子句。话虽如此,您的查询非常有效,因此我想说这就是关键!再次感谢!非常感谢您的回复,我已经在我的问题中添加了分析计划。事实上,正如您在计划中看到的那样,实际数据库需要索引和标签,而计划中最昂贵的部分实际上是带有size的子句。话虽如此,您的查询非常有效,因此我想说这就是关键!再次感谢!
match (p {my_id: 1 })-->(c)
optional match (c)-->(cc)
where size([ (p)-->(c1) where c1.sort < c.sort |c1]) < 2
return p, c, cc
match (p:Node {my_id: 1 })-->(c)
with p, c
order by c.sort asc
with p, collect(c) as children // children are in order
unwind children[..2] as child // one row for each of the first 2 children
optional match (child)-->(cc) // only matched for the first 2 children
return p, children, collect(cc) as grandchildren