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

本文关键字:关系 获取 节点 Neo4jClient Neo4j 使用 | 更新日期: 2023-09-27 18:21:40

我使用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")

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

首先,如果您正在使用[r:FOLLOW*1..4],您已经知道代码中的TypeKey如果您想为[r*1..4]获取TypeKey,那么您可以使用以下代码,主要的变化是我们将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有关。要从中获得有意义的数据,我们需要获得该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),您会发现您有一个与RelationshipInstance上的.*NodeReference属性匹配的.Reference属性,有了这些信息,您可以通过关系构建实际的TypeKey