在Neo4jClient中动态使用关系参数
本文关键字:关系 参数 动态 Neo4jClient | 更新日期: 2023-09-27 17:51:26
我试图使用参数动态传递关系类型与Neo4jclient,但它似乎没有工作。这可能吗?或者什么是等价的?基本上,我试图通过简单地传递两个节点Id和关系来编写一个实用程序方法来将两个节点关联在一起。我可能会对它进行硬编码,但我担心这违背了最佳实践,而且容易受到注射的影响。谢谢。
public static async Task<string> AddEdge(string node1Id, string relatioinship, string node2Id, bool directed = false)
{
await NeoClient.Cypher
.Match("(n1)", "(n2)")
.Where((BaseObject n1) => n1.Id == node1Id)
.AndWhere((BaseObject n2) => n2.Id == node2Id)
.CreateUnique("n1-[:{sRelationName}]->n2")
.WithParams(new {sRelationName = relatioinship})
.ExecuteWithoutResultsAsync();
return node1Id;
}
我不认为你可以通过参数创建关系名称,我在C#
中见过的唯一方法是将string.Format
用于.CreateUnique
。
如果你担心注射,一个解决方案可能是使用Enum
,所以:
public enum Relationships { Rel_One, Rel_Two }
public static async Task<string> AddEdge(string nodeId1, Relationships relationship, string nodeId2)
{
if(!Enum.IsDefined(typeof(Relationships), relationship))
throw new ArgumentOutOfRangeException("relationship", relationship, "Relationship is not defined.");
这样,如果有人试图传递一个relationship
你不使用,即尝试像AddEdge("blah", (Relationships) 200, "blah2");
你可以忽略它。
enum
:
...CreateUnique(string.Format("n1-[:{0}]-n2", relationship))
如果您在Relationships
枚举中按照您的需要命名您的值:
public enum Relationships {
HAS_A,
IS_A
//etc
}
另一个好处是您不必担心拼写错误,因为您可以在整个代码中使用Relationships
枚举进行查询。