检查邻居是否有连接节点的子集

Check if Neighbors have subset of connected nodes

我目前有一个 Neo4J 图形数据库,它存储 4 种通过边连接的不同类型的节点。 Yellow/Red 个节点连接到蓝色节点,yellow/red 个节点连接绿色节点,提供关于它们的额外信息。

我想做的是检查 selected 节点(黄色或红色)是否有一个通过蓝色节点连接的邻居,是否有一个公共连接的绿色节点的子集。

例如,如果我 select 下方的红色节点,上方的红色节点将被 return 编辑,因为它们共享同一个最左边的绿色节点邻居,它是绿色节点邻居的子集selected 红色节点。

Example Graph Structure

我目前有以下 Cypher 查询,其中 table 节点是黄色和红色节点,keyNode 是绿色节点。蓝色节点是objectType。

MATCH(table:TABLE)
where table.Name = $name
MATCH (table)-[keyRel:IS_DEFINED_BY_KEY]->(keyNode)
MATCH (table)<-[createRel:IS_CREATED_IN]-(objectType)-[createRel2:IS_CREATED_IN]->(createTables)
MATCH (createTables)-[keyRel2:IS_DEFINED_BY_KEY]->(addKey)

所以在当前查询结束时,我有 searched/selected table,它的相邻绿色节点,通过蓝色节点和绿色节点连接的 yellow/red 节点与他们相连。

现在我只想 return 连接到绿色节点子集的连接 yellow/red 节点。所以在例子中只有上面的红色节点。

有人知道我该如何实现吗?

我想我找到了解决办法。

我是反过来想的。因此,我没有通过连接到我的两个节点的蓝色节点进行搜索,而是通过绿色节点进行搜索。

如果所有其他节点的邻居也连接到所选节点,则其他节点的绿色邻居只能是所选节点绿色邻居的子集。您可以在下面找到使用过的密码查询。测试子集的有趣部分是:

匹配 (table) WHERE NOT ALL(t2key in t2keys WHERE (table)-[:IS_DEFINED_BY_KEY]->(t2key)).

MATCH(table:TABLE)
where table.Name = $name
Match (table)<-[:IS_CREATED_IN]-(objectType)

WITH Distinct table, objectType

MATCH (table)-[:IS_DEFINED_BY_KEY]->(keyNode)

MATCH (keyNode)<-[:IS_DEFINED_BY_KEY]-(T2:RECORDTABLE)
WHERE (T2.Neo4JId)<>(table.Neo4JId) and Exists ((objectType)-[:IS_CREATED_IN]->(T2))

MATCH (T2)-[:IS_DEFINED_BY_KEY]->(T2Key)

WITH table, collect(T2Key) as t2keys

// RETURN DISTINCT table, t2keys
Match (table)
WHERE NOT ALL(t2key in t2keys WHERE (table)-[:IS_DEFINED_BY_KEY]->(t2key))

Return table