繁体   English   中英

使用Neo4jClient在Neo4j中通过可变长度关系获取关系节点

[英]Get relationship nodes by Variable length relationships in Neo4j using Neo4jClient

我使用Neo4jClient,我想通过可变长度关系(n:Users {id:1})-[r:FOLLOW*1..4]-(m:Users) RETURN r获取关系属性(n:Users {id:1})-[r:FOLLOW*1..4]-(m:Users) RETURN r如何获取具有属性的节点关系,例如:

Node[0]{id:1,name:"Oliver Stone"}
Node[1]{id:2,name:"Charlie Sheen"}
Node[2]{id:3,name:"Martin Sheen"}
Node[3]{id:4,name:"TheAmericanPresident"} 

I should know , what is attribute relation between Node[0] and Node[2]? (attribute mean "FOLLOW" or "IGNORE")

首先是,如果你使用[r:FOLLOW*1..4]你已经知道TypeKey因为它是在你的代码, 如果你想获得TypeKey[r*1..4]那么你可以使用下面的代码,主要的变化是我们将R作为IEnumerable<RelationshipInstance<object>>带回了,而不仅仅是直接的RelationshipInstance<object>

var query = Client.Cypher
    .Match("(n:User)-[r*1..4]-(m:User)")
    .Where((UserEntity n) => n.Id == 1)
    .Return((n, r, m) => new
    {
        N = n.As<UserEntity>(),
        M = m.As<UserEntity>(),
        R = r.As<IEnumerable<RelationshipInstance<object>>>() //<-- IEnumerable<T>
    });

var res = query.Results;

foreach (var item in res.ToList())
    foreach (var relationshipInstance in item.R)
        Console.WriteLine("({0})-[:{1}]-({2})", item.N.Id, relationshipInstance.TypeKey, item.M.Id);

现在,假设您具有以下设置:

(Node:1)-[:IGNORE]->(Node:2)->(:FOLLOW)->(Node:3)

运行上面的代码将获得以下输出:

(1)-[:IGNORE]-(3)
(1)-[:FOLLOW]-(3)

真的不知道为了什么,和你有矛盾的类型。 假设您沿着实际路线而不只是名称(我意识到可能并非如此),我们需要更改查询的更多位。

如果您回过头来查看RelationshipInstance ,您将看到它具有两个属性: EndNodeReferenceStartNodeReference ,您还将注意到,这些对象的Id属性与您在对象中拥有的任何ID没有任何关系。 Id在这种情况下,涉及到实际的Neo4j标识。 为了从中获取有意义的数据,我们需要获取该ID,这意味着使用Node<T> 理想情况下,我们不想这样做,但是目前我不知道有任何其他方法来获取路线。

var query = Client.Cypher
    .Match("(n:User)-[r*1..4]-(m:User)")
    .Where((UserEntity n) => n.Id == 1)
    .Return((n, r, m) => new
    {
        N = n.As<Node<UserEntity>>(), //<-- Node<T>
        M = m.As<Node<UserEntity>>(), //<-- Node<T>
        R = r.As<IEnumerable<RelationshipInstance<object>>>()
    });

foreach (var item in res.ToList())
    foreach (var relationshipInstance in item.R)
        Console.WriteLine("({0})-[:{1}]-({2})", item.N.Data.Id, relationshipInstance.TypeKey, item.M.Data.Id);

现在,您已经获得了关系的所有相关数据,将它们组合在一起。 如果查看Node<T>实例之一( NM ),您将看到一个.Reference属性,它将与RelationshipInstance上的.*NodeReference属性匹配,利用该信息,您可以构建实际的按关系的TypeKey

暂无
暂无

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

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