我无法从Cypher查询中检索匹配的关系。
我有这个简单的试用代码:
var movie = client.Create(new Movie { Title = "The Matrix" });
client.Create(new Actor { Name = "Keanu Reeves" },
new ActedIn(movie, new ActedInPayload { Role = "Neo" }));
client.Create(new Actor { Name = "Hugo Weaving" },
new ActedIn(movie, new ActedInPayload { Role = "Agent Smith" }));
var actorsAndRoles = client
.Cypher
.Start(new { movie = movie })
.Match("actor-[r:ACTED_IN]->movie")
.Return((actor, r) => new
{
Actor = actor.As<Node<Actor>>()
// ActedIn = r.As<?????>()
})
.Results;
问题是我无法弄清楚如何施放r(具有匹配的关系)。
尝试了各种“.As”类型演员,但都没有奏效。转换为关系不起作用,因为我的关系类没有无参数构造函数 - 但是基本类本身没有无参数构造函数,所以不要认为这会起作用。另一方面,转换为RelationshipReference会导致异常。根本不投射(只返回r)会导致“不支持”的异常。
有关此问题的一些相关SO条目,但建议的代码不再有效或已被弃用。
如何检索匹配的关系?
答案 0 :(得分:5)
你可以为你的关系类型创建一个无参数的构造函数,你只需传递'duff'数据,我知道听起来很糟糕,但是因为你真的不需要它,它不会伤害了你:
public class ActedIn : Relationship<ActedInPayload>, IRelationshipAllowingSourceNode<Actor>, IRelationshipAllowingTargetNode<Movie>
{
public ActedIn() : base(-1, null) {}
public ActedIn(NodeReference targetNode, ActedInPayload data) : base(targetNode, data) {}
public override string RelationshipTypeKey
{
get { return "ACTED_IN"; }
}
}
所以这是ActedIn
类,无参数构造函数将'-1'链接到基础构造函数。
您的查询将变为:
var actorsAndRoles = client
.Cypher
.Start(new {movie})
.Match("actor-[r:ACTED_IN]->movie")
.Return((actor, r) => new
{
Actor = actor.As<Node<Actor>>(),
ActedIn = r.As<RelationshipInstance<ActedInPayload>>()
})
.Results;
请注意,它会被投射到类型为RelationshipInstance
而不是 ActedInPayload
的{{1}},然后才能获取您可能需要的数据:
ActedIn
这会给你类似的东西:
基努·里维斯饰演Neo--在数据库中为482- [ACTED_IN] - >&gt; 481
Hugo Weaving担任代理史密斯 - 在数据库中为483- [ACTED_IN] - &gt; 481
虽然你自己的数据库显然有不同的数字。