我使用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")
答案 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)
,您会看到它有两个属性:RelationshipInstance
和EndNodeReference
,您还会注意到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
。