use*_*862 1 relationship cypher neo4jclient
我无法从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;
Run Code Online (Sandbox Code Playgroud)
问题是我无法弄清楚如何施放r(具有匹配的关系).
尝试了各种".As"类型演员,但都没有奏效.转换为关系不起作用,因为我的关系类没有无参数构造函数 - 但是基本类本身没有无参数构造函数,所以不要认为这会起作用.另一方面,转换为RelationshipReference会导致异常.根本不投射(只返回r)会导致"不支持"的异常.
有关此问题的一些相关SO条目,但建议的代码不再有效或已弃用.
如何检索匹配的关系?
你可以为你的关系类型创建一个无参数的构造函数,你只需传递'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"; }
}
}
Run Code Online (Sandbox Code Playgroud)
所以这是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;
Run Code Online (Sandbox Code Playgroud)
注意,它被转换RelationshipInstance为类型ActedInPayload 而不是 ActedIn,以获取您可能想要的数据:
foreach (var actorsAndRole in actorsAndRoles)
{
Console.WriteLine("{0} acted as {1} - which is in the db as {2}-[ACTED_IN]->{3}",
actorsAndRole.Actor.Data.Name,
actorsAndRole.ActedIn.Data.Role,
actorsAndRole.ActedIn.StartNodeReference.Id,
actorsAndRole.ActedIn.EndNodeReference.Id);
}
Run Code Online (Sandbox Code Playgroud)
哪个会给你这样的东西:
基努·里维斯饰演Neo--在数据库中为482- [ACTED_IN] - > 481
Hugo Weaving担任代理史密斯 - 在数据库中为483- [ACTED_IN] - > 481
虽然你自己的数据库显然有不同的数字.