Neo4j 基于相关节点属性的过滤器

Neo4j 基于相关节点属性的过滤器,neo4j,cypher,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 ni

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

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

…但我必须匹配其他路径,然后再次过滤它们,这对我来说似乎既奇怪又低效。还有其他方法吗?

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


但是考虑到您可以更改并且确实需要更改,您可以将属性
furColor
设置为
Brown
节点的关系类型。因此,不必将信息保留在属性中,您可以为所有颜色创建其他节点,而不仅仅是将狗节点与furColor类型的关系关联到这些颜色节点。相比之下,查询MATCH子句(如
MATCH person-[:has]->dog-[:furColor]->brown
(当您还在开始阶段指定brown节点时)

您可以尝试这样做,但要根据匹配性能来衡量它

其中的路径表达式返回路径集合,使用集合函数
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

一个有趣的想法。我认为这不适合我正在研究的实际问题,但这是一个值得考虑的解决方案。谢谢。仅供参考,在开始条款之后可以使用WHERE。但是在这个特定的场景中,您不能这样做,因为dog节点是在MATCH部分中指定的,否则如果可以在START子句中指定,您可以使用WHERE进行筛选。
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