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

时间:2014-09-12 05:51:19

标签: c# .net neo4j neo4jclient

我使用Neo4jClient并且我希望通过变长关系(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")

1 个答案:

答案 0 :(得分:2)

首先,如果您使用的是[r:FOLLOW*1..4],那么您已经知道代码中的TypeKey if ,您希望获得TypeKey { {1}}然后您可以使用以下代码,主要更改是我们将[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) ,您会看到它有两个属性:RelationshipInstanceEndNodeReference,您还会注意到StartNodeReference这些属性与对象中的任何Id无关。在这种情况下,Id与实际的Neo4j Id相关。要从中获取有意义的数据,我们需要获取该ID,这意味着使用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>N),您会看到M属性与.Reference匹配.*NodeReference上的属性,根据该信息,您可以按关系建立实际的RelationshipInstance