繁体   English   中英

如何使用密码检索我的neo4j图中两个节点之间的唯一路径列表?

[英]How to retrieve a list of unique paths between two nodes in my neo4j graph using cypher?

因此,我在neo4j中有一个有向图,其中有两个节点类型,即A和B。基本上,顶部A指向多个B,每个指向多个A,递归向下。 像这样:

A1-> B1,B2,B3

B1-> A3,A4,A7

B2-> A5,A6,A8

A3-> B3

A4-> B3

A5-> B3

B3-> A9

无论如何,我要接受两个不同的A,以查询出这两个A之间的所有唯一路径。 因此,从上面给出的A1和A9,我需要以下内容作为输出:

A1-> B1-> A3-> B3-> A9,

A1-> B1-> A4-> B3-> A9,

A1-> B2-> A5-> B3-> A9,

A1-> B3-> A9

如果可能的话,我也想从相同的查询中删除B(因为在这种情况下不需要使用B),所以最终结果如下:

A1-> A3-> A9,

A1-> A4-> A9,

A1-> A5-> A9,

A1-> A9

如果没有,我可以在查询后手动进行,尽管在查询中会更好。 我将如何准确地构成该查询?

到目前为止,我有这样的事情:

var dic = new Dictionary<string, object> {{a1.toString(), a1}, {a2.toString(), a2}};

var query = _graphClient.Cypher
    .Start(dic)
    .Match(String.Format("p={0}-[*]->{1}", a1.toString(), a2.toString()))
    //I don't know what goes here exactly... .Return(something)
    .Results;

return query.Single();

我想我需要对多个密码查询执行某些操作才能删除B。 也许像这样使用它作为中介并将其应用于任何深度:

a1-[]->b-[]->a2
return a1, a2;

任何帮助都将是惊人的! 提前谢谢你!!!

更新

借助Christophe Willemsen的评论和这篇文章( Neo4j .NET Client-获取从节点到其根的路径 ),我能够获得以下c#代码,除了从路径中删除B之外,该代码可以执行所有操作:

var query = _graphClient.Cypher
    .Match("p = (a2:A)-[*]->(a1:A)")
    //Where and AndWhere's for matching a1 and a2 as necessary
    .Return<IEnumerable<A>>("nodes(p)")
    .OrderByDescending("length(p)")
    .Results
    .SelectMany(result => new List<List<A>> {result.ToList()});

return query.ToList();

如果有人知道如何指定nodes(p)仅返回A,则应该这样做。 我可以简单地遍历每条删除B的路径,但是如果其中有很多,尤其是如果有一些巧妙的密码方法来实现,那并不是很有效。 到目前为止,感谢您的帮助!

您可能可以将allShortestPaths算法与诸如此类的独特算法一起使用:

MATCH (a:A { name:'A1' }),(aa:A { name:'A8' }), p = allShortestPaths((a)-[*]-(aa))

RETURN DISTINCT (p), collect(nodes(p)) AS x

ORDER BY length(p) DESC 

LIMIT 5

我已经将Neo4j控制台设置为可在此处使用的沙箱: http ://console.neo4j.org/?id=pjf2qg

我挣扎着如何能够从结果中删除B节点

更新

我最终只从路径中提取了A标签化的节点:

MATCH (a:A {name:'A1'}),(aa:A {name:'A8'}),
p = allShortestPaths((a)-[*]-(aa))
WITH DISTINCT(p) as pths, COLLECT(nodes(p)) as x
UNWIND(x) as u
WITH FILTER(s IN u WHERE 'A' IN labels(s)) AS zz, pths as paths
RETURN paths, zz

克里斯

我的第一个答案是通过一个有效的查询进行编辑的。

顺便说一句,当尝试查找此查询时,我发现以下内容:

当尝试过滤节点(p)的集合而没有展开时,标识符不被视为节点,而是被视为集合,我不知道这是否是预期的行为:

以下查询将失败,说明标识符s是一个集合,并且期望使用Node

MATCH (a:A {name:'A1'}),(aa:A {name:'A8'}),
p = allShortestPaths((a)-[*]-(aa))
WITH p as paths, COLLECT(nodes(p)) as x
WITH filter(s IN x WHERE 'A' IN labels(s)) AS zz
RETURN zz

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM