在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;
    }

在Neo4jClient中动态使用关系参数

我不认为你可以通过参数创建关系名称,我在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枚举进行查询。