我遇到的情况是我试图过滤掉与具有特定属性的节点无关的节点。例如,假设我有一个查询让我所有人,但我想过滤到只有那些有棕色皮毛的狗。我喜欢做的事情是这样的:
//For simplicity's sake, assume nodes 1,2,3 are the potentials I care about
START person=node(1,2,3)
WHERE person-[:has]->(dog{furColor:"Brown"}) // <-- would be nice to use
RETURN person
然而,这不起作用。解析器明确地告诉我:
MATCH中不允许使用模式元素的属性。
(有趣的是当我使用“WHERE”时它引用“MATCH”,但无论如何)。因此,您无法以这种方式引用节点的属性。我还有其他选择吗?通过添加MATCH条款,我能够模仿我想要的东西......
START person=node(1,2,3)
MATCH person-[:has]->dog
WHERE dog.furColor! = "Brown"
RETURN person
...但对我来说似乎很奇怪而且效率低下,我必须匹配其他路径,然后再将它们过滤掉。还有另一种方式吗?
答案 0 :(得分:1)
我担心在您的图表设计中没有其他方法可以使用WHERE
子句。
但考虑到您可以更改并且您真的想要,您可以将属性furColor
设置为Brown
节点的关系类型。因此,不是将信息保留在属性中,而是可以为所有颜色创建其他节点,而不仅仅将dog节点与furColor类型的关系与那些颜色节点相关联。对于像MATCH person-[:has]->dog-[:furColor]->brown
这样的MATCH子句,查询会更快(当你在START阶段指定褐色节点时)
答案 1 :(得分:0)
你可以试试这个,但要根据比赛表现来衡量它。
路径表达式返回路径集合,其中集合函数extract
和集合谓词all
可以对该路径集合进行操作。
START person=node(1,2,3)
WHERE ALL(dog in extract( path in person-[:has]->() : last(path) // last node of path
WHERE dog.furColor! = "Brown"
)
RETURN person