根据开发人员手册第3.2.4节“参数:
”参数不能用于以下构造,因为它们构成了编译成查询计划的>查询结构的一部分:
- 属性键;所以,MATCH(n)WHERE n。$ param ='something'无效(source)
没有办法绕过这个(c#,使用官方驱动程序)?我有一种情况,特定类型的节点可以包含几个到几百个属性,我希望用户能够搜索其中任何一个,而无需事先编写所有可能的查询。理想情况下,我希望能够做类似
的事情MATCH (a) WHERE ({prop} CONTAINS {val}) RETURN a
提供prop: "a.Description"
和val: "Freeform item description"
这是可能的,还是字符串连接(有相关的缺点)这里唯一的可能性?
答案 0 :(得分:1)
语法n['foo']
可用于引用n.foo
。
所以,这应该有用(我使用现在首选的$foo
语法代替{foo}
参数):
MATCH (a) WHERE a[$propName] CONTAINS $val
RETURN a;
propName: "Description"
和val: "Freeform item description"
答案 1 :(得分:1)
@ cybersam的回复是获得结果的一种方式,但正如InverseFalcon所说 - 你失去了索引性能 - 假设你正在计划使查询比仅仅是示例更详细。
您不需要编写数百个查询(每个属性1个),这肯定只是string.Format
的工作吗?这样你可以解决字符串的连续问题,并且可以正确使用索引。
类似的东西:
const string QueryFormat = "MATCH (a) WHERE (a.{0} CONTAINS {{val}})";
您使用的:
string.Format(QueryFormat, "Description");
因此...
session.Run(string.Format(QueryFormat, "Description"), /*params object here*/);
据推测,您已经提供了一个供用户选择的属性列表,因此将参数传递给它是有意义的。 string.Format
没有concat所做的问题,因此性能明智,从长远来看会更好,因为你可以在Neo4j上使用索引。