グラフデータベースならグラフ理論の問題ぐらい解けるだろう、という乱暴な短絡思考から昔のグラフのお題を解いてみました。
昔のお題がネタなら、今回の解法もネタだったりします。
とにかくCypher で書く
Cypher歴2日なので不手際があるかもしれません。
// see http://d.hatena.ne.jp/E_Mattsan/20120511/1336748744 // 番号付きの点を作る UNWIND range(1, 20) AS number CREATE (n:Point {number: number}); // 点から右方向と下方向の辺を作る UNWIND // ただし右端と下端を除く [i IN range(1, 20) WHERE NOT (i % 4 = 0 OR i IN range(17, 20))] AS number MATCH (n:Point {number: number}), (right:Point {number: number + 1}), (bottom:Point {number: number + 4}) CREATE (n)-[:Edge]->(right), (n)-[:Edge]->(bottom); // 右端の点から下方向の辺を作る UNWIND [i IN range(1, 4) | i * 4] AS number MATCH (n:Point {number: number}), (bottom:Point {number: number + 4}) CREATE (n)-[:Edge]->(bottom); // 下端の点から右方向の辺を作る UNWIND range(17, 19) AS number MATCH (n:Point {number: number}), (right:Point {number: number + 1}) CREATE (n)-[:Edge]->(right); // 点1から点20への経路の個数を数える MATCH (:Point {number: 1})-[*]->(:Point {number: 20}) RETURN count(*) AS count; // 点6-点10, 点11-点12, 点14-点15 の辺を削除する MATCH (_6:Point {number: 6}), (_10:Point {number: 10}), (_11:Point {number: 11}), (_12:Point {number: 12}), (_14:Point {number: 14}), (_15:Point {number: 15}), (_6)-[_6_10]->(_10), (_11)-[_11_12]->(_12), (_14)-[_14_15]->(_15) DELETE _6_10, _11_12, _14_15; // 点1から点20への経路の個数を数える MATCH (:Point {number: 1})-[*]->(:Point {number: 20}) RETURN count(*) AS count;
実行してみる
上記のクエリを count_paths.cypher という名前で保存します。
neo4j-shell コマンドを使ってクエリを実行します。
Neo4j に干渉するデータが入っていない状態で実行してください。
$ neo4j-shell -file count_paths.cypher +-------------------+ | No data returned. | +-------------------+ Nodes created: 20 Properties set: 20 Labels added: 20 5 ms +-------------------+ | No data returned. | +-------------------+ Relationships created: 24 15 ms +-------------------+ | No data returned. | +-------------------+ Relationships created: 4 6 ms +-------------------+ | No data returned. | +-------------------+ Relationships created: 3 6 ms +-------+ | count | +-------+ | 35 | +-------+ 1 row 14 ms +-------------------+ | No data returned. | +-------------------+ Relationships deleted: 3 6 ms +-------+ | count | +-------+ | 15 | +-------+ 1 row 9 ms
それぞれ経路数が35, 15と出力されました。
いつか読むはずっと読まない:数学ガール新刊
結城先生のメッセージカードが入っていました。
数学ガールの秘密ノート/ベクトルの真実 (数学ガールの秘密ノートシリーズ)
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/11/18
- メディア: 単行本
- この商品を含むブログ (11件) を見る