Neo4j/Cypher:动态匹配 属性

Neo4j/Cypher: Match on dynamic property

根据开发者手册第 3.2.4 节的参数:

Parameters cannot be used for the following constructs, as these form part of the >query structure that is compiled into a query plan:

  • property keys; so, MATCH (n) WHERE n.$param = 'something' is invalid (source)

有没有办法解决这个问题(c#,使用官方驱动)?我有一个特定类型的节点可以包含几个到数百个属性的情况,我希望用户能够搜索其中的任何一个,而不必提前编写所有可能的查询。理想情况下,我希望能够做类似于

的事情
MATCH (a) WHERE ({prop} CONTAINS {val}) RETURN a

提供字典,其中 prop: "a.Description"val: "Freeform item description"

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

语法n['foo']可用于引用n.foo

所以,这应该可行(我使用现在首选的 $foo 语法而不是 {foo} 作为参数):

MATCH (a) WHERE a[$propName] CONTAINS $val
RETURN a;

其中 propName: "Description"val: "Freeform item description"

@cybersam 的回复是获得结果的一种方式,但正如 InverseFalcon 所说 - 你失去了索引性能 - 假设你计划使查询比示例更详细。

您不需要编写数百个查询(每个 属性 一个),这肯定只是 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*/);

大概您已经为 select 的用户提供了一个属性列表,因此将其与参数一起传递是有意义的。 string.Format 没有 concat 的问题,所以在性能方面它会更好 运行 因为你可以在 Neo4j 上使用索引。