Neo4j-匹配具有多个连接的节点

时间:2018-07-18 12:12:00

标签: neo4j graph-databases

在我的数据库中有控制器和设备。它们之间有两种连接,一种是直接逻辑连接,一种是通过电缆节点的物理连接。

A)逻辑连接非常简单,控制器和设备通过名为“ logicalConn”的连接进行简单连接。

B)物理连接比较棘手。控制器是CTRL_ENDP(端点)节点的父级,而设备是DEV_ENDP节点的父级。这些端点然后与CABLE节点连接。 CABLE节点有两种连接类型:源连接和目标连接。

这里是一个例子:

      ________________[:logicalConn]__________________
     /                                                \
    /                                                  \
   /                                                    \
CONTROLLER                                             DEVICE
   \                                                    /
  [:parentOf]                                        [:parentOf]
     \                                                / 
   CTRL_ENDP --- [:src] --- CABLE --- [:tar] --- DEV_ENDP

我需要做什么? 因此,在理想情况下,每个控制器都通过物理和逻辑连接连接到特定设备。但是我需要确定是否确实如此! 所以我需要两个查询:

1)如果未逻辑连接(仅是物理连接),则首先查询应与控制器和设备一起返回。

2)第二个查询应该返回相同的值,只是这次是相反的,因此当它们不是物理连接时,仅是逻辑连接。

如果可以将上述两个查询压缩为一个查询,这也很好,但是对于一个更简单的解决方案,也许我们应该如上所述地进行两个查询。

如果有人可以帮助我,我将不胜感激!

编辑:

其他信息:

  • 此查询将用于验证整个数据库,以查找未正确连接的ctrl-dev对。因此,解决方案必须查询整个图形,而不仅仅是查询特定的控制器-设备对。
  • 在控制器(A)和目标设备(B)之间,物理上可能存在直接设备。像这样:A-电缆-C-电缆-D-电缆-B,其中C和D也是设备,它也应作为A和B之间的物理连接返回true。

1 个答案:

答案 0 :(得分:0)

我们可以使用指定的模式来确定两个节点之间是否存在这样的路径,将其解释为布尔值,然后在return中输出:

我假设您正在通过id参数查找:DEVICE和:CONTROLLER节点,让我们使用$ devId和$ conId作为输入参数:

MATCH (c:CONTROLLER {id:$conId}), (d:DEVICE {id:$devId})
WITH exists((c)-[:logicalConn]-(d)) as logicallyConnected,
 exists((c)-[:parentOf]-()-[:src]-()-[:tar]-()-[:parentOf]-(d)) as physicallyConnected
RETURN logicallyConnected, physicallyConnected

对于给定的模式,我们感兴趣的只是结构,在这种情况下是关系类型。如果您不想遍历的关系类型可能存在不同的带标签节点,那么您可能需要将标签添加到路径中的节点占位符,否则关系类型应该就足够了。