Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j-基于节点的限制查询';s级_Neo4j_Cypher - Fatal编程技术网

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