Neo4j.NET客户端执行字符串Cypher查询

本文关键字:Cypher 查询 字符串 执行 NET 客户端 Neo4j | 更新日期: 2023-09-27 18:27:40

是否可以使用Neo4j.NET客户端或任何其他模块将CYPHER查询作为普通的旧字符串执行?

例如,如果我想在我的图形数据库中添加一些节点,并且已经组装了语句,那么有没有一种方法可以执行字符串:

CREATE (n:Edit {name:"L-1154LX"});

我希望批量处理已经创建的CREATECYPHER查询列表。

Neo4j.NET客户端执行字符串Cypher查询

在https://github.com/Readify/Neo4jClient/wiki/cypher#manual-查询高度劝阻

然而,这将对性能不利,并且对安全性有风险。

这对性能不利,因为它将不得不重新解析每个查询。您应该使用参数,如https://github.com/Readify/Neo4jClient/wiki/cypher-examples#create-a-user通过这种方式,查询文本保持一致,只是参数有所不同,因此不会在每次调用时产生查询编译成本。

这对安全性来说是有风险的,因为你很容易编码错误,并使自己面临注入风险。

因此,请不要运行手动查询,除非您真正了解自己在做什么。它们是故意藏起来的。

我正在编写一个.NET应用程序,该应用程序可以从Excel电子表格中提取节点和关系,以便动态生成并加载到neo4j中(请参阅下面的翻译/管理对象模型)。

当我通过neo4jclient将它们加载到neo4j时,我将不知道我的节点在运行时是什么样子;它们可以有任意数量的属性,也可以有任意名称和值。在的示例中https://github.com/Readify/Neo4jClient/wiki/cypher-examples看起来我应该有本地类来引用属性名称和值;但这是行不通的。我是不是错过了一个技巧?参数化查询?(即使是这些例子也需要一个本地的、硬编码的类)。

 public class Node
        {
            public string NodeType = "";
            public List<Attribute> Attributes;
            public List<Relationship> ParentRelationships;
            public List<Relationship> ChildRelationships;
            public Node(string nodeType)
            {
                NodeType = nodeType;
                Attributes = new List<Attribute>();
                ParentRelationships = new List<Relationship>();
                ChildRelationships = new List<Relationship>();
            }
            public void AddAttribute(Attribute attribute)
            {
                //We are not allowing empty attributes
                if(attribute.GetValue() != "")
                    this.Attributes.Add(attribute);
            }
            public string GetIdentifier()
            {
                foreach (Attribute a in Attributes)
                {
                    if (a.IsIdentifier)
                        return a.GetValue();
                }
                return null;
            }
            public void AddParentRelationship(Relationship pr)
            {
                ParentRelationships.Add(pr);
            }
            public void AddChildRelationship(Relationship cr)
            {
                ChildRelationships.Add(cr);
            }
  public class Attribute
        {
            private string Name;
            private string Value;
            public bool IsIdentifier;
            public Attribute(string name, string value, bool isIdentifier)
            {
                SetName(name);
                SetValue(value);
                IsIdentifier = isIdentifier;
            }
            public void SetName(string name)
            {
                Name = name.Trim();
            }
            public void SetValue(string value)
            {
                Value = value.Trim();
            }
            public string GetName()
            {
                return Name;
            }
            public string GetValue()
            {
                return Value;
            }
        }