如何创建多个节点并将其与另一个节点相关联

时间:2014-06-27 22:54:57

标签: neo4j cypher neo4jclient

想象一下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();

1 个答案:

答案 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例如?