使用neo4jclient搜索任意节点属性

时间:2017-07-11 17:37:13

标签: c# .net neo4j neo4jclient

我有像

这样的数据访问功能
public IList<NodeType> GetNodesByProperties(IDictionary<string, string> properties)

返回所有属性匹配的所有neo4j节点。

我找不到任何通过neo4jclient进行此类搜索的官方方法。我写了一个函数:

public IList<NodeType> GetNodesByProperties(IDictionary<string, string> properties)
{
    var baseQuery = neo4jclient.Cypher
        .Match("(node:NodeType)")
        .Where("true");

    foreach (var tupple in properties)
        baseQuery = baseQuery.AndWhere($"node.{tupple.Key} = \"{tupple.Value}\"");

    var resultQuery = baseQuery
        .Return(node => node.As<NodeType>());

    return resultQuery.Results;
}

哪种方法有效,但这会产生明显的Cypher注入攻击风险,因为该函数会将原始文本直接插入到Cypher查询中。

如何安全地搜索任何节点属性?

1 个答案:

答案 0 :(得分:1)

如果您不想构建字符串/连接,则可以在查询期间将节点和关系用作属性映射。例如:

:param prop: "login"
:param login: "ikwattro"

-

MATCH (n:User) WHERE n[$prop] = $login RETURN n

哪个会起作用,但您将使用索引用法:/

我相信虽然您的应用程序不应该允许用户输入他想要的任何内容,但您可以使用内置过程获得有关模式的大量信息,然后您可以将用户输入与列表可能的价值观。

如果这不是用户输入属性键,则不存在使用字符串连接的问题。