![](/img/trans.png)
[英]How to check if a relation exists between two nodes using .net client of 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.