Cypher 查询 returns 无结果
Cypher query returns no results
我有一个查找 2 个节点之间的最短路径的查询。这些节点被标记为设备,但它们也连接到 Apps 节点。所以我有 2 app_ids,我想通过这些 ID 找到与这些 app_ids 相关的 2 个设备之间的所有连接,以及有关这些连接中所有受影响设备的信息。所以我有这个查询:
WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app
WITH device[1] as first, device[7] as second, app
WITH first.device_id AS id1, second.device_id as id2, application
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application
此查询 returns 节点之间的所有路径,但是,我还需要所有连接到受影响设备的应用程序的数据。结果我只得到所有设备节点数据加上 2 个应用程序节点数据。我知道这是因为我在第一个 Match 查询中过滤了 Apps 节点。所以我尝试做这样的事情来在查询中找到与受影响的设备相关的所有应用程序数据:
WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app, COLLECT(distinct d.device_id) as device_ids
MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)
WITH device[1] as first, device[7] as second, app, COLLECT(a_all) as apps
WITH first.device_id AS id1, second.device_id as id2, application, apps
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application, apps
问题是我没有得到任何记录。虽然,我检查过 device_ids 节点列表不为空。而当我运行这个查询的各个部分分开时,结果显示正常。此查询可能有什么错误?
问题在第4行:
MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)
具体来说device_ids
。这是前一行的集合,但我猜没有 :Device 其中 device_id 是一个包含所有这些列表元素的特定顺序的列表。
我的猜测是您打算匹配具有该列表中的设备 ID 的设备,而您不能用这种方法做到这一点。
这里有一种方法可以做你想做的事:
...
MATCH (d_all:Device)-[:DEV_APP]->(a_all:Apps)
WHERE d_all.device_id IN device_ids
...
或者:
...
UNWIND device_ids as device_id
MATCH (d_all:Device {device_id:device_id)-[:DEV_APP]->(a_all:Apps)
...
或者如果设备集合包含您想要的所有设备:
...
// using plurals for variable names of lists
WITH COLLECT(d) as devices, COLLECT(distinct a) as apps, COLLECT(distinct d.device_id) as device_ids
UNWIND devices as device
MATCH (device)-[:DEV_APP]->(a_all:Apps)
...
我有一个查找 2 个节点之间的最短路径的查询。这些节点被标记为设备,但它们也连接到 Apps 节点。所以我有 2 app_ids,我想通过这些 ID 找到与这些 app_ids 相关的 2 个设备之间的所有连接,以及有关这些连接中所有受影响设备的信息。所以我有这个查询:
WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app
WITH device[1] as first, device[7] as second, app
WITH first.device_id AS id1, second.device_id as id2, application
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application
此查询 returns 节点之间的所有路径,但是,我还需要所有连接到受影响设备的应用程序的数据。结果我只得到所有设备节点数据加上 2 个应用程序节点数据。我知道这是因为我在第一个 Match 查询中过滤了 Apps 节点。所以我尝试做这样的事情来在查询中找到与受影响的设备相关的所有应用程序数据:
WITH ["000001", "000002"] as IDS
UNWIND IDS as app_ids
MATCH (d:Device)-[:DEV_APP]->(a:Apps {app_id: app_ids})
WITH COLLECT(d) as device, COLLECT(distinct a) as app, COLLECT(distinct d.device_id) as device_ids
MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)
WITH device[1] as first, device[7] as second, app, COLLECT(a_all) as apps
WITH first.device_id AS id1, second.device_id as id2, application, apps
MATCH path=allShortestPaths((d1:Device {device_id:id1})-[:DEV_COL1|DEV_COL2|:DEV_COL3*..5]->(d2:Device {device_id:id2}))
RETURN path, application, apps
问题是我没有得到任何记录。虽然,我检查过 device_ids 节点列表不为空。而当我运行这个查询的各个部分分开时,结果显示正常。此查询可能有什么错误?
问题在第4行:
MATCH (d_all:Device {device_id: device_ids})-[:DEV_APP]->(a_all:Apps)
具体来说device_ids
。这是前一行的集合,但我猜没有 :Device 其中 device_id 是一个包含所有这些列表元素的特定顺序的列表。
我的猜测是您打算匹配具有该列表中的设备 ID 的设备,而您不能用这种方法做到这一点。
这里有一种方法可以做你想做的事:
...
MATCH (d_all:Device)-[:DEV_APP]->(a_all:Apps)
WHERE d_all.device_id IN device_ids
...
或者:
...
UNWIND device_ids as device_id
MATCH (d_all:Device {device_id:device_id)-[:DEV_APP]->(a_all:Apps)
...
或者如果设备集合包含您想要的所有设备:
...
// using plurals for variable names of lists
WITH COLLECT(d) as devices, COLLECT(distinct a) as apps, COLLECT(distinct d.device_id) as device_ids
UNWIND devices as device
MATCH (device)-[:DEV_APP]->(a_all:Apps)
...