2017-09-22 30 views
1

我有一个方法,我传递一个现有节点的标题和两个列表。一个包含新节点的标题,另一个包含应作为属性添加到新关系的计数。两个列表都包含相同数量的项目。如何使用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(); 
} 

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

回答

2

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

首先,我创建与:Article节点:

: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) 
) 

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

之后,我使用配置的Neo4j的浏览器参数

结果图:

Resultant graph

编辑:

等效使用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(); 
}