是否可以使用Neo4j .NET Client或任何其他模块将CYPHER查询作为普通旧字符串执行?
例如,如果我想在我的图形数据库中添加一些节点并且已经组装了语句,那么是否有一种方法可以执行字符串:
CREATE (n:Edit {name:"L-1154LX"});
我希望批处理已经创建的CREATE CYPHER查询列表。
答案 0 :(得分:5)
在https://github.com/Readify/Neo4jClient/wiki/cypher#manual-queries-highly-discouraged
正式记录然而,这对性能有害,并且对安全性有风险。
它对性能不利,因为它必须重新解析每个查询。您应该使用参数,例如https://github.com/Readify/Neo4jClient/wiki/cypher-examples#create-a-user中的示例。这样,查询文本保持一致,只是参数变化,因此您不会在每次调用时产生查询编译成本。
安全性存在风险,因为您可以轻松地解决编码错误,并使自己面临注入风险。
因此,除非您真正理解您正在做的事情,否则请不要进行手动查询。他们故意隐藏起来。
答案 1 :(得分:1)
我正在编写一个.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;
}
}