繁体   English   中英

如何使用neo4jclient展开两个列表?

[英]How to unwind two lists with neo4jclient?

我有一个方法,可以传递现有节点的标题和两个列表。 一个包含新节点的标题,另一个包含应作为属性添加到新关系中的计数。 两个列表包含相同数量的项目。

我展开了新文章列表,并可以使用以下代码成功添加新节点:

public async Task AddArticlesWithRelationshipsAsync(List<string> newArticleTitles, string linkedFromArticle, List<int> count)
{
    await client
        .Cypher
        .Unwind(newArticleTitles, "newArticleTitle")
        .Match("(linkedFromArticle:Article)")
        .Where("linkedFromArticle.title = { linkedFromArticle}")
        .WithParam("linkedFromArticle", linkedFromArticle)
        .Merge("(newArticle: Article { title: newArticleTitle } )")
        .Merge("(newArticle)< -[:REFERENCES { count: 500 }]-(linkedFromArticle)")
        .ExecuteWithoutResultsAsync();
}

但是,它的硬编码计数为500。我正在努力利用<int>的计数。 到目前为止,我最好的尝试是同时展开count列表:

public async Task AddArticlesWithRelationshipsAsync(List<string> newArticleTitles, string linkedFromArticle, List<int> count)
{
    await client
        .Cypher
        .Unwind(newArticleTitles, "newArticleTitle")
        .Unwind(count, "count")
        .Match("(linkedFromArticle:Article)")
        .Where("linkedFromArticle.title = { linkedFromArticle}")
        .WithParam("linkedFromArticle", linkedFromArticle)
        .Merge("(newArticle: Article { title: newArticleTitle } )")
        .Merge("(newArticle)< -[:REFERENCES { count: count }]-(linkedFromArticle)")
        .ExecuteWithoutResultsAsync();
}

不幸的是,这会在所有新节点之间添加具有所有关系计数的关系。 如何将两个列表与具有相同索引的项目配对?

我编写了一个Cypher查询,使用range()函数和FOREACH解决了该问题。

首先,我创建了:Article节点,其中:

CREATE (:Article {title : 'Article A'})

之后,我用以下命令配置了Neo4j Browser参数:

:params { linkedFromArticle : 'Article A', newArticleTitles : ['Article B', 'Article C', 'Article D'], count : [10, 20, 30] }

然后,Cypher查询:

MATCH (linkedFromArticle:Article)
WHERE linkedFromArticle.title = {linkedFromArticle}
WITH linkedFromArticle, RANGE(0, SIZE({count}) - 1) AS indexes
FOREACH(index IN indexes |
    MERGE (newArticle:Article { title: {newArticleTitles}[index] } )
    MERGE (newArticle)-[:REFERENCES {count : {count}[index]}]->(linkedFromArticle)
)

结果图:

结果图

编辑:

使用Neo4jClient的等效C#函数:

public async Task AddArticlesWithRelationshipsAsync(List<string> newArticleTitles, string linkedFromArticle, List<int> count) {
    await client
    .Cypher
    .WithParam("newArticleTitles", newArticleTitles)
    .WithParam("linkedFromArticle", linkedFromArticle)
    .WithParam("count", count)
    .Match("(linkedFromArticle:Article)")
    .Where("linkedFromArticle.title = {linkedFromArticle}")
    .With("linkedFromArticle, RANGE(0, SIZE({count}) - 1) AS indexes")
    .ForEach("(index IN indexes | " +
             "MERGE (newArticle:Article { title: {newArticleTitles}[index] } )" +
             "MERGE (newArticle)-[:REFERENCES {count : {count}[index]}]->(linkedFromArticle)" +
     ")")
    .ExecuteWithoutResultsAsync();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM