2016-08-28 17 views
2

私はグラフを扱っていて、最近はneo4jを知っていました。Neo4jのノードでシンプルサイクルを見つける

neo4jを使用すると、特定のノードを通過するすべての単純なサイクルをグラフで見つけることができますか?

私はすでにa modification of Johnson's algorithmを実装してjava/pythonコードでこれを行うことができます。

これは、私が作成したグラフの一例に過ぎないのNeo4jデータベース上で実行することができサイファーコードです:

CREATE (John:Person { name : '@john',facebook: 'facebook.com/john'}) 
CREATE (Josh:Person { name : '@josh',facebook: 'facebook.com/josh'}) 
CREATE (Dan:Person { name : '@dan',facebook: 'facebook.com/dan'}) 
CREATE (Kenny:Person { name : '@kenny',facebook: 'facebook.com/kenny'}) 
CREATE (Bart:Person { name : '@bart',facebook: 'facebook.com/bart'}) 
CREATE (Mike:Person { name : '@mike',facebook: 'facebook.com/mike'}) 
CREATE (Jenny:Person { name : '@jenny',facebook: 'facebook.com/jenny'}) 
CREATE (Frank:Person { name : '@frank',facebook: 'facebook.com/frank'}) 
CREATE (Erick:Person { name : '@erick',facebook: 'facebook.com/erick'}) 
CREATE (Lynda:Person { name : '@lynda',facebook: 'facebook.com/lynda'}) 

CREATE (Lynda)-[:KNOWS]-> (Josh) 
CREATE (Lynda)-[:KNOWS]-> (Frank) 
CREATE (Lynda)-[:KNOWS]-> (Bart) 
CREATE (Josh)-[:KNOWS]-> (Erick) 
CREATE (Josh)-[:KNOWS]-> (Jenny) 
CREATE (Josh)-[:KNOWS]-> (Dan) 
CREATE (Dan)-[:KNOWS]-> (Lynda) 
CREATE (Dan)-[:KNOWS]-> (Josh) 
CREATE (Dan)-[:KNOWS]-> (Mike) 
CREATE (Dan)-[:KNOWS]-> (Kenny) 
CREATE (Mike)-[:KNOWS]-> (Kenny) 
CREATE (Kenny)-[:KNOWS]-> (Bart) 
CREATE (Bart)-[:KNOWS]-> (Josh) 
CREATE (Frank)-[:KNOWS]-> (Erick) 
CREATE (Erick)-[:KNOWS]-> (Frank) 

...と、これらは、グラフ内のすべてのサイクルです:

Josh->Dan->Lynda->Josh 
Josh->Dan->Lynda->Bart->Josh 
Josh->Dan->Josh 
Josh->Dan->Mike->Kenny->Bart->Josh 
Josh->Dan->Kenny->Bart->Josh 

ここでは、簡単なテストケースのリスト:

1- input: Josh 
    output (all the cycles): 
    Josh->Dan->Lynda->Josh 
    Josh->Dan->Lynda->Bart->Josh 
    Josh->Dan->Josh 
    Josh->Dan->Mike->Kenny->Bart->Josh 
    Josh->Dan->Kenny->Bart->Josh 
2- input: Lynda 
    output: 
    Josh->Dan->Lynda->Josh 
    Josh->Dan->Lynda->Bart->Josh 

答えて

6

次とサイファーでそれを行うことができますクエリ:

MATCH p=(n)-[*]->(n) RETURN nodes(p) 

クエリのテキスト表現は、次のとおりです。

は私に開始ノードと終了ノードが同じであるとの完全なパスが、これがあると、発信方向

注意を持ってパスを探します、

MATCH p=(n)-[*1..15]->(n) RETURN nodes(p) 

たぶん、あなたは最小深さ2を持つようにもしたい理由:大/中グラフに高価なクエリ、あなたは元のために、パスの深さを制限することができます自分自身との関係を持つノードが1の深さで返されます;-)

+0

ありがとうございます@クリストフ!あなたが指摘した深さの限界は驚くべき特別ボーナスです! –

+0

結果を分析した後、クエリは重複ノードを考慮に入れます。パス内の重複ノードを削除できるように、クエリを変更するにはどうすればよいですか? –

関連する問題