Neo4j:如何限制子查询

时间:2014-10-10 17:03:46

标签: neo4j graph-databases

我刚刚将英语维基百科导入Neo4j并正在玩耍。我首先查看链接到“柏林”页面的页面

MATCH p=(p1:Page {title:"Berlin"})<-[*1..1]-(otherPage)
WITH nodes(p) as neighbors
LIMIT 500
RETURN DISTINCT neighbors

效果很好。我接下来想要实现的是显示第二级关系。为了能够正确显示它们,我想将一级关系节点的数量限制为20,然后查询下一级关系。

如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

我不知道维基百科模型,但我假设有许多不同的关系类型,这就是为什么 - [* 1..1] - ,我认为这类似于 - [] - 或甚至 - 。我怀疑它有任何严重的影响。

您可以使用带有LIMIT的WITH来收集第一级匹配并将其限制为20。然后,您可以使用那些(&lt; 20)其他页面作为起点执行第二场比赛。

MATCH (p1:Page {title:"Berlin"})<-[*1..1]-(otherPage:Page)
WITH p1, otherPage
LIMIT 20
MATCH (otherPage)<-[*1..1]-(secondDegree:Page)
WHERE secondDegree <> p1
WITH otherPage, secondDegree
LIMIT 500
RETURN otherPage, COLLECT(secondDegree)

有很多方法可以返回数据,这只会返回第一次匹配与后续匹配数组。

如果唯一的关系类型是:链接并且您想保留起始节点,那么您可以将查询更改为:

MATCH (p1:Page {title:"Berlin"})<-[:Link]-(otherPage:Page)
WITH p1, otherPage
LIMIT 20
MATCH (otherPage)<-[:Link]-(secondDegree:Page)
WHERE secondDegree <> p1
WITH p1, otherPage, secondDegree
LIMIT 500
RETURN p1, otherPage, COLLECT(secondDegree)