检查邻居是否有连接节点的子集
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
我目前有一个 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