2

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

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

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

4

2 回答 2

1

恐怕没有其他方法可以WHERE在图形设计中使用该子句。

但考虑到您可以更改并且您确实想要更改,您可以使属性成为节点furColor的关系类型。Brown因此,您可以为所有颜色创建额外的节点,而不是将信息保留在属性中,而不仅仅是将狗节点与 furColor 类型的关系与这些颜色节点相关联。比,对于 MATCH 子句的查询会更快MATCH person-[:has]->dog-[:furColor]->brown(当您还在 START 阶段指定棕色节点时)

于 2013-02-18T09:10:45.767 回答
0

你可以试试这个,但要根据比赛表现来衡量它。

where 中的路径表达式返回路径集合,您可以使用集合函数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
于 2013-02-20T07:33:12.030 回答