2

我最近开始将 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 和开放集和封闭集来填充自定义对象及其子关系的信息。它绝不是有效的,因此为什么我想以某种方式使用路径。有问题的自定义对象看起来有点像这样。

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; }
}

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

4

3 回答 3

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应该是你所追求的?

于 2013-02-27T12:18:28.003 回答
1

我最终找到了这个问题的答案,并写了一篇关于这个主题的博客文章。但是,因为您不必阅读该帖子的内容...

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

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

于 2013-03-14T14:12:20.223 回答
1

我从 Chris Skardon 的代码http://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,但我认为如果我的关系具有属性就会有。

于 2016-01-05T22:54:05.153 回答