来自Neo4j的py2neo查询子图

时间:2017-09-28 00:35:06

标签: neo4j cypher py2neo

我想查询具有给定源的大图数据库中的子图。假设我想要一个给定节点的前25个邻居,以及这组节点之间的所有关系,我的查询应该如何?

目前我有:

MATCH (source {label:'source'}) -[:relation]-> (neighbors)
RETURN source,neighbors
LIMIT 25

这适用于neo4j浏览器,返回26个节点以及这些节点之间的所有现有关系。但是,当我尝试通过py2neo执行相同的查询时:

py2neo.cypher.execute(query)

它只返回26个节点以及源和25个邻居之间的25个直接边连接,这是有道理的。但我想知道为什么浏览器结果与py2neo结果之间存在差异。以及如何在返回所有边连接的情况下实现相同的结果。

总的来说,我想知道以下较小的问题:

  • 如何将单个节点附加到neo4j中的节点列表?例如nlist =邻居+节点

  • 如何返回两组节点之间的所有关系?例如return(a in nlist) - [:relation] - > (b in nlist)

编辑:

为了可视化,我希望得到的结果图像是这样的

subgraph

而不是像这样的星图

star

感谢您提出任何意见。

1 个答案:

答案 0 :(得分:1)

关于Neo4j浏览器和py2neo结果之间的区别:可能您正在使用图形可视化模式,其中包含选项"连接结果节点"启用。尝试禁用(在图像下方)或将可视化模式更改为"文本",例如。

Graph visualization options

关于Cypher查询,您可以使用collect()合并sourceneighbors

MATCH (source {label:'source'})-[:relation]->(neighbors)
WITH collect(source) + collect(neighbors) as all
UNWIND all AS nodes
RETURN nodes

为了返回两组节点之间的所有边(在本例中是从set到它自己),请参阅这篇文章:Neo4j, get all relationships between a set of nodes

然后使用Cypher查询返回子图

MATCH (source {label:'source'})-[:relation]->(neighbors)
WITH collect(distinct source) + collect(neighbors) as all
UNWIND all AS nodes
MATCH (nodes)-[:relation]->(nei)
WHERE nei in nodes
RETURN nodes,nei