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 上使用索引。
根据开发者手册第 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 上使用索引。