Neo4j客户端在Unwind组节点上返回唯一路径

时间:2018-03-12 11:28:21

标签: c# neo4j neo4jclient

Cypher的目标是让每个Node和她在链接属性上使用相同的sulotionId达到第二级连接,我想要返回的节点有几种类型,TypeA / TypeB都是NodeType的子节点。 / p>

我的Cypher看起来像这样:

var graphResult = graphClient.Cypher
            .Unwind(Nodes, "singleNode")
            .Match("p = (innerNode:Intell{Id:singleNode.Id}) - 
            [r:CONTAINS*1..2{solutionId:{innerSolutionId}}] - ()")
            .WithParam("innerSolutionId", solutionId)
            .Return(p => new
                   {
                       Nodes = 
                    Neo4jClient.Cypher.Return.As<IEnumerable<Neo4JNodeDSO>>("nodes(p)"),
                       Relationships = Neo4jClient.Cypher.Return.As<IEnumerable<Neo4JLinkDSO>>("rels(p)")
                   }).Results;

但问题是,如果有2个节点与中间节点连接并且它们在我展开的组内,它会显示路径2次(从每侧开始1)以防止这种情况的任何方法? 例: A-> B-> C而A和C在节点的grop中返回: A-> B-> C路径和C-> B-> A路径

非常感谢先进。

1 个答案:

答案 0 :(得分:0)

你有几个选择 - 首先是指导你的关系 - 所以:

p = (innerNode:Intell)-[r:CONTAINS]->()

这会有所帮助,但你仍然可以获得重复。

Shortest Path可能是你最好的选择,因为它会返回一个而不是倍数。如下所示:

var graphResult = graphClient.Cypher
    .Unwind(Nodes, "singleNode")
    .Match("p = shortestPath( (innerNode:Intell{Id:singleNode.Id})-[r:CONTAINS*1..2{solutionId:{innerSolutionId}}]-() )")
    .WithParam("innerSolutionId", solutionId)
    .Return(p => new {
        Nodes = Neo4jClient.Cypher.Return.As<IEnumerable<Neo4JNodeDSO>>("nodes(p)"),
        Relationships = Neo4jClient.Cypher.Return.As<IEnumerable<Neo4JLinkDSO>>("rels(p)")
        })
    .Results;