Neo4j / Cypher:匹配动态属性

时间:2017-06-07 20:15:58

标签: c# neo4j cypher neo4jclient

根据开发人员手册第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"

的词典

这是可能的,还是字符串连接(有相关的缺点)这里唯一的可能性?

2 个答案:

答案 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上使用索引。