想象一下C#中的这些类:
public class User
{
public int Id { get; set; }
public string Username { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public string[] HashTags { get; set; }
}
每个用户都可以添加一个帖子,它们之间的关系就是作者,每个帖子都可以有一个哈希标签数组,每个哈希标签都是图形中的一个单独节点。
当我要保存每个帖子时,我会在grph中找到用户,创建一个帖子节点并将它们与作者关系联系起来。
问题是我如何创建每个hashTag并将其与同一查询中的帖子相关联。 (在交易中)。
如何动态添加项目以进行查询以创建它。 问题是它无法在create的一行中创建节点和关系。
这是我到目前为止所尝试的内容:
var cypherQuery = Db.Instance.Cypher
.Match("(user:User)")
.Where((User user) => user.Username == "XYZ")
.Create("user-[:Author]->(post:Post {newPost})")
.WithParam("newPost", new Post() {Id = 1, Text = "Here is my post about #someHashTag"});
//How to relate this node to the number of hashTags in Post Object???
cypherQuery.ExecuteWithoutResults();
在单个查询中是好还是应该在多次往返中分割它。
我尝试了一些与foeach有关的东西,但它发现帖子在foreach循环中没有任何价值:
我尝试过这样的事情:
var cypherCommand = Db.Instance.Cypher
.Match("(user:User)")
.Where((User user) => user.Username == "farvashani")
.Create("user-[:Author]->(post:Post {newPost})")
.WithParam("newPost", "here is my post about @Tag1 and Tag2")
.ForEach(@"(hashtag in {hashTags}|
MERGE post-[:Mentioned]->(hash:HashTag {Text: hashtag}))")
.WithParam("hashTags", new string[] {"Tag1", "Tag2"});
cypherCommand.ExecuteWithoutResults();
答案 0 :(得分:1)
在我看来,我认为你必须先预处理Text属性。
String text = ""Here is my post about #someHashTag""; // For example
List<String> hashTags = new List<String>();
int cnt = 0;
foreach (Match match in Regex.Matches(text, @"(?<!\w)#\w+"))
{
hashTags.Add(match.Value);
}
然后创建Post的新实例:
Post newPost = new Post
{
Id = 1,
Text = "Here is my post about #someHashTag",
hashTags = hashTags
};
所以,你可以使用这个Cypher:
var cypherCommand = Db.Instance.Cypher
.Match("(user:User)")
.Where((User user) => user.Username == "farvashani")
.Create("user-[:Author]->(post:Post {newPost})")
.WithParam(new {newPost}).ExecuteWithoutResults();
希望得到这个帮助。
P / s:我可以问你一个问题吗?如果您将每个hashTag用作Post的标签,您认为检索分离的图表会更好吗? newPost:someHashTag例如?