【问题标题】:Neo4j - match nodes with multiple connectionsNeo4j - 匹配具有多个连接的节点
【发布时间】:2018-07-18 12:12:00
【问题描述】:

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

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

B) 物理连接更复杂。控制器是 CTRL_ENDP(端点)节点的父节点,设备是 DEV_ENDP 节点的父节点。这些端点与 CABLE 节点相连。 CABLE 节点有两种类型的连接:源和目标。

这是一个例子:

      ___________________[:controls]__________________
     /                                                \
    /                                                  \
   /                                                    \
CONTROLLER                                             DEVICE
   \                                                    /
  [:parentOf]                                        [:parentOf]
     \                                                / 
   CTRL_ENDP --- [:src] --- CABLE --- [:tar] --- DEV_ENDP

我需要做什么? 因此,在一个完美的场景中,每个控制器都通过物理和逻辑连接连接到某个设备。但我需要确定是否真的如此! 所以我需要两个查询:

1) 第一个查询应该返回一个控制器和一个设备,如果它们没有逻辑连接,只有物理连接。

2) 第二个查询应该返回相同的结果,只是这次是反向的,所以当它们没有物理连接时,只有逻辑连接。

如果上述两个可以压缩到一个查询中也很好,但是对于一个更简单的解决方案,也许我们应该有两个查询,就像我上面描述的那样。

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

编辑:

附加信息:

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

【问题讨论】:

  • 连接的控制器和设备节点之间是否有任何模式(在关系和/或节点中)将始终成立?具体来说,我正在寻找可以让我们根据路径中的节点类型或关系类型来约束匹配路径的信息。还是仅仅找到任何不包含 :logicalConn 的连接路径就可以算作物理连接?
  • 我认为仅仅为另一个节点寻找方法不是一个好的选择,因为例如电缆节点有一个名为“电缆”的父节点,而他的父节点是“建筑”。因此,当我们找到新的路线时,它可能会通过电缆、建筑,并以这种方式找到与设备的连接,但那将是完全错误的。是的,有一个模式。在设备和控制器之间始终使用我在原始帖子中描述的这种模式。难点在于下层路径的模式可以连续出现多次。
  • 在这种情况下,我们是否可以使用关系或标签将路径列入黑名单以防止匹配您想要避免的向下路径?
  • 控制器和设备具有相同的父级:建筑。并且电缆有一个父级,称为电缆,其父级也在构建。所以我们应该将这些列入黑名单,而不是去那里找到错误的路线。

标签: neo4j cypher graph-databases


【解决方案1】:

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

我假设您正在通过类似 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

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

【讨论】:

  • 我忘了告诉一些额外的信息。请看我在原帖中编辑后写的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多