我正在设置Neo4j数据库以收集多个孤立的图形(在这些图形上,查询可能一起运行,也可能不一起运行)。
例如:
在所附的图像中的图是三个完全图的不相交并集,并且我希望三个不同的图有三个端点,而完全图有一个端点(即所有三个完全图)。runQueryOnSubGraph2?query="Match (n) return n;" //output will include the nodes 11 to 15
runQueryOnSubGraph2?query="Match (n) return n;" //output will include the nodes 11 to 15
个runQueryOnFullGraph?query="Match (n) return n;" //output will include the nodes 1 to 35
每个不相交子图中的每个节点都有一个唯一的属性(如n.subgraph = {1,2,3}),因此不一定每次都需要运行连通分支查找器。
我不想把where子句的负担转嫁给用户,这就是为什么我在寻找一个自动化的条件逻辑。由于查询可以有任意数量的变量(例如,第一个查询中的n,m),我想不出一个通用的where
子句来描述变量名。而且,子图可能没有连接,所以像apoc.path.subgraphAll
这样的解决方案将不起作用。
理想情况下,我想要的是:"Match (n)-->(m) return n" + " where (p:*) p.subgraph = 1"
,其中在查询中引用的每个节点都应该具有属性subgraph
,并且它必须等于1
。
任何建议/想法都将不胜感激。谢谢!
1条答案
按热度按时间5vf7fwbs1#
我有一个非常低效的解决方案,基于这样一个事实,即由于子图都是完全的,每个子图都有一条从n到n的路径。
你可以试试这样的逻辑:
1.查找从(n)到(n)的任意长度的路径
1.求出每条路径中最长的一条,这将遍历n所在的子图中的每个节点。
1.将所有最长路径收集到一个列表中,这样就有了节点n1、n2等及其最长路径
1.取列表中的第一项(因为每个路径都包含所有节点),现在你有节点n1、n2等,还有1条路径遍历子图中的每个节点。
1.按路径长度聚合(假设所有子图的大小不同)
1.取每个长度的第一条路径
1.使用标签或属性标记每个路径中的每个节点
如果您可以在每个图中识别出一个特定的节点,则可以修改此逻辑以避免产生O(n!)路径。
我可以想出一些粗略的代码,只是让我知道。