根据相关节点的属性进行过滤

时间:2013-02-15 22:15:12

标签: neo4j cypher

我遇到的情况是我试图过滤掉与具有特定属性的节点无关的节点。例如,假设我有一个查询让我所有人,但我想过滤到只有那些有棕色皮毛的狗。我喜欢做的事情是这样的:

//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

...但对我来说似乎很奇怪而且效率低下,我必须匹配其他路径,然后再将它们过滤掉。还有另一种方式吗?

2 个答案:

答案 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