在Neo4j中查找通过给定节点的所有简单循环

3

我正在处理图表,并最近了解到neo4j

neo4j能否帮助我找出经过给定节点的所有简单循环呢?

我已经可以在java/python代码中实现约翰逊算法的修改版来完成此操作。

这只是我创建的一个图表示例,它是可以在neo4j数据库上执行的Cypher代码:

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
1个回答

12

你可以使用以下Cypher查询来完成它:

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

查询的文本表示为:

查找起始节点和目标节点相同,并且完整路径具有出向方向的路径。

请注意,对于中等/较大规模的图形,这是一项昂贵的查询,您可以限制路径的深度,例如:

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

也许您希望最小深度为2,因为具有指向自身关系的节点将返回深度为1;-)


谢谢@Christophe!你指出的深度限制是一个惊人的额外奖励! - Jorge E. Hernández
分析结果后,查询考虑到了重复节点。我该如何修改查询以便在路径中删除这些重复节点? - Jorge E. Hernández

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接