使用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")
首先,如果您正在使用[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
,你会发现它有两个属性:EndNodeReference
和StartNodeReference
,你还会注意到它们的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>
实例(N
或M
),您会发现您有一个与RelationshipInstance
上的.*NodeReference
属性匹配的.Reference
属性,有了这些信息,您可以通过关系构建实际的TypeKey
。