用图数据库解七桥问题

本文采用Cypher语言解决七桥问题。关于七桥问题的描述,参见我另一篇博文 用SQL解七桥问题

图数据库用“图”数据结构来保存和查询数据,用节点和关系来搭建数据模型。图数据库的优点在于能快速处理复杂的关系。

以下的操作在neo4j图数据库中执行。

 

一、创建问题模型


创建陆地

create (n:land{name:'N1'});
create (n:land{name:'N2'});
create (n:land{name:'N3'});
create (n:land{name:'N4'});
create (n:land{name:'N5'});

查询所有的陆地

match (n) return n;

neo4j> match (n) return n;
+----------------------+
| n                    |
+----------------------+
| (:land {name: "N1"}) |
| (:land {name: "N2"}) |
| (:land {name: "N3"}) |
| (:land {name: "N4"}) |
+----------------------+

4 rows available after 2 ms, consumed after another 1 ms

在陆地之间创建桥

match (n:land{name:'N1'}),(m:land{name:'N3'}) create(n)-[r:bridge{name:'B1'}]->(m);
match (n:land{name:'N1'}),(m:land{name:'N3'}) create(n)-[r:bridge{name:'B3'}]->(m);
match (n:land{name:'N1'}),(m:land{name:'N4'}) create(n)-[r:bridge{name:'B2'}]->(m);
match (n:land{name:'N1'}),(m:land{name:'N4'}) create(n)-[r:bridge{name:'B4'}]->(m);
match (n:land{name:'N1'}),(m:land{name:'N2'}) create(n)-[r:bridge{name:'B5'}]->(m);
match (n:land{name:'N2'}),(m:land{name:'N3'}) create(n)-[r:bridge{name:'B6'}]->(m);
match (n:land{name:'N2'}),(m:land{name:'N4'}) create(n)-[r:bridge{name:'B7'}]->(m);

查询所有的桥,同时给出被桥连接的陆地

match (n)-[r]->(m) return n,r,m;

neo4j> match (n)-[r]->(m) return n,r,m;
+----------------------------------------------------------------------+
| n                    | r                      | m                    |
+----------------------------------------------------------------------+
| (:land {name: "N2"}) | [:bridge {name: "B7"}] | (:land {name: "N4"}) |
| (:land {name: "N1"}) | [:bridge {name: "B4"}] | (:land {name: "N4"}) |
| (:land {name: "N1"}) | [:bridge {name: "B2"}] | (:land {name: "N4"}) |
| (:land {name: "N1"}) | [:bridge {name: "B5"}] | (:land {name: "N2"}) |
| (:land {name: "N2"}) | [:bridge {name: "B6"}] | (:land {name: "N3"}) |
| (:land {name: "N1"}) | [:bridge {name: "B3"}] | (:land {name: "N3"}) |
| (:land {name: "N1"}) | [:bridge {name: "B1"}] | (:land {name: "N3"}) |
+----------------------------------------------------------------------+

7 rows available after 1 ms, consumed after another 1 ms

显示某一块陆地通过某座桥直达另一块陆地的关系(不考虑方向),根据陆地名和桥名排序

match (n)-[r]-(m) with n,r,m order by n.name,r.name,m.name return n,r,m;

neo4j> match (n)-[r]-(m) with n,r,m order by n.name,r.name,m.name return n,r,m;
+----------------------------------------------------------------------+
| n                    | r                      | m                    |
+----------------------------------------------------------------------+
| (:land {name: "N1"}) | [:bridge {name: "B1"}] | (:land {name: "N3"}) |
| (:land {name: "N1"}) | [:bridge {name: "B2"}] | (:land {name: "N4"}) |
| (:land {name: "N1"}) | [:bridge {name: "B3"}] | (:land {name: "N3"}) |
| (:land {name: "N1"}) | [:bridge {name: "B4"}] | (:land {name: "N4"}) |
| (:land {name: "N1"}) | [:bridge {name: "B5"}] | (:land {name: "N2"}) |
| (:land {name: "N2"}) | [:bridge {name: "B5"}] | (:land {name: "N1"}) |
| (:land {name: "N2"}) | [:bridge {name: "B6"}] | (:land {name: "N3"}) |
| (:land {name: "N2"}) | [:bridge {name: "B7"}] | (:land {name: "N4"}) |
| (:land {name: "N3"}) | [:bridge {name: "B1"}] | (:land {name: "N1"}) |
| (:land {name: "N3"}) | [:bridge {name: "B3"}] | (:land {name: "N1"}) |
| (:land {name: "N3"}) | [:bridge {name: "B6"}] | (:land {name: "N2"}) |
| (:land {name: "N4"}) | [:bridge {name: "B2"}] | (:land {name: "N1"}) |
| (:land {name: "N4"}) | [:bridge {name: "B4"}] | (:land {name: "N1"}) |
| (:land {name: "N4"}) | [:bridge {name: "B7"}] | (:land {name: "N2"}) |
+----------------------------------------------------------------------+

14 rows available after 3 ms, consumed after another 0 ms

 

二、对问题求解

求解七桥问题

match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)-[r7]-(n8)
with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7,r7,n8
order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name,r7.name,n8.name
return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name,r7.name,n8.name

neo4j> match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)-[r7]-(n8)
       with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7,r7,n8
       order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name,r7.name,n8.name
       return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name,r7.name,n8.name
       ;
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| n1.name | r1.name | n2.name | r2.name | n3.name | r3.name | n4.name | r4.name | n5.name | r5.name | n6.name | r6.name | n7.name | r7.name | n8.name |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
+-----------------------------------------------------------------------------------------------------------------------------------------------------+

0 rows available after 297 ms, consumed after another 1 ms

从上面结果看,无重复遍历七座桥是无解的

 

求无重复遍历六座桥的所有欧拉路径

match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)
with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7
order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name
return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name

neo4j> match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)
       with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7
       order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name
       return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name;
+---------------------------------------------------------------------------------------------------------------------------------+
| n1.name | r1.name | n2.name | r2.name | n3.name | r3.name | n4.name | r4.name | n5.name | r5.name | n6.name | r6.name | n7.name |
+---------------------------------------------------------------------------------------------------------------------------------+
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B4"    | "N1"    | "B5"    | "N2"    | "B6"    | "N3"    |
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B4"    | "N1"    | "B5"    | "N2"    | "B7"    | "N4"    |
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B7"    | "N2"    | "B5"    | "N1"    | "B4"    | "N4"    |
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B5"    | "N2"    | "B6"    | "N3"    |
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B5"    | "N2"    | "B7"    | "N4"    |
| "N1"    | "B1"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B7"    | "N2"    | "B5"    | "N1"    | "B2"    | "N4"    |

...... 省略一些输出
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B3"    | "N3"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B5"    | "N2"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B4"    | "N1"    | "B1"    | "N3"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B4"    | "N1"    | "B5"    | "N2"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B1"    | "N3"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B2"    | "N1"    | "B5"    | "N2"    |
+---------------------------------------------------------------------------------------------------------------------------------+

256 rows available after 14 ms, consumed after another 4 ms

有256个欧拉路径。

 

求无重复遍历六座桥的欧拉环

match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)
where n1.name=n7.name
with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7
order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name
return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name

neo4j> match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)-[r5]-(n6)-[r6]-(n7)
       where n1.name=n7.name
       with n1,r1,n2,r2,n3,r3,n4,r4,n5,r5,n6,r6,n7
       order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name
       return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name,r5.name,n6.name,r6.name,n7.name;
+---------------------------------------------------------------------------------------------------------------------------------+
| n1.name | r1.name | n2.name | r2.name | n3.name | r3.name | n4.name | r4.name | n5.name | r5.name | n6.name | r6.name | n7.name |
+---------------------------------------------------------------------------------------------------------------------------------+
+---------------------------------------------------------------------------------------------------------------------------------+

0 rows available after 37 ms, consumed after another 0 ms

遍历六座桥的欧拉环无解

 

求无重复遍历四座桥的汉密尔顿路径

match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)
where not n1.name=n3.name and not n1.name=n4.name
and not n2.name=n4.name and not n2.name=n5.name
and not n3.name=n5.name
with n1,r1,n2,r2,n3,r3,n4,r4,n5
order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name
return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name

neo4j> match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)
       where not n1.name=n3.name and not n1.name=n4.name
       and not n2.name=n4.name and not n2.name=n5.name
       and not n3.name=n5.name
       with n1,r1,n2,r2,n3,r3,n4,r4,n5
       order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name
       return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name;
+-----------------------------------------------------------------------------------------+
| n1.name | r1.name | n2.name | r2.name | n3.name | r3.name | n4.name | r4.name | n5.name |
+-----------------------------------------------------------------------------------------+
| "N1"    | "B1"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B2"    | "N1"    |
| "N1"    | "B1"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B4"    | "N1"    |
| "N1"    | "B2"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    |
| "N1"    | "B2"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    |
| "N1"    | "B3"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B2"    | "N1"    |
| "N1"    | "B3"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B4"    | "N1"    |
| "N1"    | "B4"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    |
| "N1"    | "B4"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    |
| "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B2"    | "N4"    | "B7"    | "N2"    |
| "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B4"    | "N4"    | "B7"    | "N2"    |
| "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B7"    | "N2"    |
| "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B7"    | "N2"    |
| "N2"    | "B7"    | "N4"    | "B2"    | "N1"    | "B1"    | "N3"    | "B6"    | "N2"    |
| "N2"    | "B7"    | "N4"    | "B2"    | "N1"    | "B3"    | "N3"    | "B6"    | "N2"    |
| "N2"    | "B7"    | "N4"    | "B4"    | "N1"    | "B1"    | "N3"    | "B6"    | "N2"    |
| "N2"    | "B7"    | "N4"    | "B4"    | "N1"    | "B3"    | "N3"    | "B6"    | "N2"    |
| "N3"    | "B1"    | "N1"    | "B2"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    |
| "N3"    | "B1"    | "N1"    | "B4"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    |
| "N3"    | "B3"    | "N1"    | "B2"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    |
| "N3"    | "B3"    | "N1"    | "B4"    | "N4"    | "B7"    | "N2"    | "B6"    | "N3"    |
| "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B2"    | "N1"    | "B1"    | "N3"    |
| "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B2"    | "N1"    | "B3"    | "N3"    |
| "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B4"    | "N1"    | "B1"    | "N3"    |
| "N3"    | "B6"    | "N2"    | "B7"    | "N4"    | "B4"    | "N1"    | "B3"    | "N3"    |
| "N4"    | "B2"    | "N1"    | "B1"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    |
| "N4"    | "B2"    | "N1"    | "B3"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    |
| "N4"    | "B4"    | "N1"    | "B1"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    |
| "N4"    | "B4"    | "N1"    | "B3"    | "N3"    | "B6"    | "N2"    | "B7"    | "N4"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B2"    | "N4"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B1"    | "N1"    | "B4"    | "N4"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B2"    | "N4"    |
| "N4"    | "B7"    | "N2"    | "B6"    | "N3"    | "B3"    | "N1"    | "B4"    | "N4"    |
+-----------------------------------------------------------------------------------------+

32 rows available after 5 ms, consumed after another 1 ms

 

求无重复遍历四座桥的汉密尔顿环

match (n1)-[r1]-(n2)-[r2]-(n3)-[r3]-(n4)-[r4]-(n5)
where not n1.name=n3.name and not n1.name=n4.name
and not n2.name=n4.name and not n2.name=n5.name
and not n3.name=n5.name
and n1.name=n5.name
with n1,r1,n2,r2,n3,r3,n4,r4,n5
order by n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name
return n1.name,r1.name,n2.name,r2.name,n3.name,r3.name,n4.name,r4.name,n5.name

与遍历四座桥的汉密尔顿路径的结果相同,输出省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值