如何在Neo4jClient中检索路径?

时间:2013-02-27 09:20:15

标签: .net neo4jclient

我最近开始使用Neo4JClient进行.NET集成,并且(最终)想出了大部分内容。但是,这个让我难过。

我有兴趣从Cypher查询中获取路径,最好是在POCO对象中,这样我就可以在前端处理这些查询。

所以我的问题基本上是如何在Neo4JClient中执行此操作?如果我不能,那么其​​他任何Neo4J .NET客户端是否都支持这个?

示例密码查询:

start n = node:idx(id="{id}")

MATCH p=(n)-[:RELATED_TO*0..3]-()

RETURN p;

所以,我希望特定节点周围的所有节点都具有传入和传出关系,深度为3.还有另一种类型的查询,但它使用withs,我需要找出Neo4JClient是否支持(另一个)但问题是)。

到目前为止,我一直在使用带有开放和封闭集的Gremlin来填充自定义对象,并提供有关其子关系的信息。它绝不是有效的,因此我想以某种方式用路径来做这件事。有问题的customobject看起来有点像这样。

public class ConnectedNode : BaseNode
{
    public List<NodeRelation> RelatedNodes { get; set; }

    public ConnectedNode()
    {
        RelatedNodes = new List<NodeRelation>();
    }
}

public class NodeRelation
{
    // ... various properties for relationship payload type stuff
    public ConnectedNode RelatedNode { get; set; }
    public RelationshipDirection Direction { get; set; }
}

我很高兴能够在我正在寻找的路径上回收节点和关系数据,只要它有效。

3 个答案:

答案 0 :(得分:1)

你试过了吗?

ICypherFluentQueryReturned<PathsResult> query
    = graphClient.Cypher
                    .StartWithNodeIndexLookup("n", "idx", "id", id)
                    .Match("p=(n)-[:RELATED_TO*0..2]-()")
                    .Return<PathsResult>("p");
IEnumerable<PathsResult> res = query.Results;

res中的每个结果应该是您所追求的结果吗?

答案 1 :(得分:1)

我最终找到了这个问题的答案,并在这个问题上写了blog post。但是,你不必阅读它的主旨的帖子......

首先,使用EXTRACT函数提取路径的节点和关系。这将为您提供2列结果。将此2列结果包含在您自己选择的POCO中,该POCO采用节点列表和RelationshipInstances。然后使用Projection将查询检索到此类对象中。瞧!

希望这有帮助,它帮助了我。

答案 2 :(得分:0)

我从Chris Skardon的codehttp://geekswithblogs.net/cskardon/archive/2013/07/23/neo4jclient-ndash-getting-path-results.aspx)开始,刚开始删除关系类,看它是否有效。我喜欢Chris的解决方案,因为它一次性返回节点属性以及关系(包括TypeKey)。事实证明,您不需要创建任何新类。

    var queryResults = graphClient.Cypher
                .Match("p=(n)-[:RELATED_TO|OTHER_RELATION*0..2]-()")
                .Return(p => new 
                {
                    Nodes = Return.As<IEnumerable<Node<**YOUR_NODE_CLASS**>>>("nodes(p)"),
                    Relationships = Return.As<IEnumerable<RelationshipInstance<Dictionary<string,string>>>>("rels(p)")
                })
                .Results; 
       resultsPath.Dump();//Use LINQPad to see the results

我使用的关系对象是Dictionary<string,string>(您可以使用它代替**YOUR_NODE_CLASS**) - 对我来说,RelationshipReference.Data字段中没有数据,但我认为如果我的关系有属性,那就是。