Neo4j-获取某些节点和关系

时间:2019-04-25 16:24:45

标签: neo4j cypher

我有一个显示节点和关系的应用程序。显示结果后,可以通过gui添加节点和关系。当用户完成操作后,我想根据所有节点和链接的Neo4j id再次从数据库中获取所有数据(因为到目前为止我在前端没有所有数据)。对我而言,最困难的部分是,有一些“浮动”节点在gui的结果中没有关系(它们在数据库中将具有关系,但是我不希望这些关系)。值得一提的是,在我的关系中,我具有开始和结束节点ID。我本来想从那里开始,但是那时我没有这些浮动节点。 让我们看一下这个绘制效果不佳的示例图像: Poorly drawn example

如您所见:

  • 节点1链接(无方向)到节点2。
  • 节点2链接到节点3(从2到3)
  • 节点3链接到节点4(从3到4)
  • 节点3也链接到节点5(无方向)
  • 节点6是一个没有关系的浮动节点

让我们假设:

  • id(1和2之间的关系)= 11
  • id(2与3之间的关系)= 12
  • id(3和4之间的关系)= 13
  • id(3和5之间的关系)= 14

请记住,在真实数据的后面,所有这些节点之间都有更多的关系,如何通过Neo4j重新创建此图像?我尝试做类似的事情:

match path=(n)-[rels*]-(m)
where id(n) in [1, 2, 3, 4, 5]
and all(rel in rels where id in [11, 12, 13, 14])
and id(m) in [1, 2, 3, 4, 5]
return path

但是,由于多种原因,这不能正常工作。另外,仅在所有节点上进行匹配并不能获得关系。我需要合并多个查询吗?可以在1个查询中完成吗?我需要编写自己的插件吗?

我正在使用Neo4j 3.3.5。

1 个答案:

答案 0 :(得分:1)

您不需要保留节点ID的列表。每个关系都指向其2个末端节点。由于始终需要两个末端节点,因此仅使用关系ID列表即可免费获得它们。

此查询将从关系ID列表中返回每个单一关系路径。如果您使用的是neo4j浏览器,则其可视化效果应将这些短路径编织在一起并显示原始的完整路径。

MATCH p=()-[r]-()
WHERE ID(r) IN [11, 12, 13, 14]
RETURN p

顺便说一下,所有neo4j关系都有一个方向。您可以选择在创建一个(使用MERGE)和/或查询一个方向时不指定方向,但是它仍然具有方向。而且neo4j Browser可视化将始终显示方向。

[已更新]

如果您还希望在关系列表中包括未附加到关系的“浮动”节点,则可以仅使用单独的浮动节点ID列表。例如:

MATCH p=()-[r]-()
WHERE ID(r) IN [11, 12, 13, 14]
RETURN p
UNION
MATCH p=(n)
WHERE ID(n) IN [6]
RETURN p