我有一个看起来像这样的Neo4j关系:
(a:Article)<-[:TRANSLATES]-(t:ArticleTranslation)
Article
标签应用于仅包含唯一标识符的节点,ArticleTranslation
标签应用于包含以下内容的节点:
然后我有一个ICypherFluentQuery
构造如下:
Match("(t:ArticleTranslation)-[:TRANSLATES]->(a:Article)")
.Where("(a.Id = {id})")
.AndWhere("(t.LanguageCode = {lang} OR (t.LanguageCode = 'en' and NOT a<--(:ArticleTranslation { LanguageCode: {lang} })))")
.WithParams(new { id, lang })
从这里,我了解到我可以轻松地将(a, t)
映射到包含两个对象实例的匿名对象,例如:
new { Article = new Article { /* Article Properties */ },
Translation = new ArticleTranslation { /* Translation Properties */ } }
但是,在我的应用程序中,使用和&#34;文章&#34;更有用(也更直观)。和&#34;翻译&#34;作为单一实体,例如:
public class Article
{
public string Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public string LanguageCode { get; set; }
}
我设法通过添加以下内容来实现此目的:
.Return((a, t) => new Article
{
Id = a.As<Article>().Id,
Title = t.As<Article>().Title,
Body = t.As<Article>().Body,
LanguageCode = t.As<Article>().LanguageCode
});
然而,这是不实用的(特别是在增加属性数量时),看起来它可能会调用重复的映射。
在没有引入独立ArticleTranslation
实体的情况下,是否有更简洁的表达方式?
答案 0 :(得分:0)
你可以通过传入一个无参数的委托告诉Neo4jClient生成一个任意的Cypher RETURN
语句 - 并将其映射到所需的类型:
.Return(() => Return.As<ArticleTranslation>(
"{ArticleId:a.Id, Title:t.Title, Body:t.Body, LanguageCode:t.LanguageCode}"))
在此示例中,返回文字地图,然后由Neo4jClient映射到ArticleTranslation
类型。