在 Neo4jClient 中为关系动态使用参数
Dynamically using params for relationship in Neo4jClient
我正在尝试使用参数通过 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;
}
我认为您不能通过参数创建关系 name,我在 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
枚举进行查询。
我正在尝试使用参数通过 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;
}
我认为您不能通过参数创建关系 name,我在 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
枚举进行查询。