在Neo4j中链接Any()和None()的意外行为

在Neo4j中链接Any()和None()的意外行为,neo4j,cypher,Neo4j,Cypher,我试图得到的是,对于任何属性名称(键),节点都有特定的属性值,而对于任何属性,节点都没有其他值 简言之,伪谷歌查询应该是这样的: +Tom +val1 +val2 (...) -Cruise -valX -valY (...) MATCH (n) WHERE ( ANY ( p in KEYS(n) WHERE n[p] CONTAINS 'Tom' ) AND NONE ( p in KEYS(n) WHERE n[p] CONTAINS 'Cruise') ) RETURN n

我试图得到的是,对于任何属性名称(键),节点都有特定的属性值,而对于任何属性,节点都没有其他值

简言之,伪谷歌查询应该是这样的:

+Tom +val1 +val2 (...) -Cruise -valX -valY (...)
MATCH (n) WHERE (
  ANY ( p in KEYS(n) WHERE n[p] CONTAINS 'Tom' ) AND
  NONE ( p in KEYS(n) WHERE n[p] CONTAINS 'Cruise')
)
RETURN n
而密码查询应该是这样的:

+Tom +val1 +val2 (...) -Cruise -valX -valY (...)
MATCH (n) WHERE (
  ANY ( p in KEYS(n) WHERE n[p] CONTAINS 'Tom' ) AND
  NONE ( p in KEYS(n) WHERE n[p] CONTAINS 'Cruise')
)
RETURN n
但是电影数据库(:play movie graph)的测试结果只是一个空列表,而数据库中还有其他名为“Tom”的演员,例如Tom Hanks。 (匹配(n)其中(任意(键(n)中的p,其中n[p]包含'Tom'))返回n 给出[汤姆·蒂克沃、汤姆·汉克斯、汤姆·克鲁斯、汤姆·斯凯里特])

所以我用“om”代替“Tom”,这次的结果是“om”的不完整列表:

match (n) where (
 any( p in KEYS(n) WHERE n[p] contains 'om') and 
 none( p in Keys(n) WHERE n[p] contains 'Cruise')
 )
 return n
给予

还尝试了NOT ANY()代替NONE(),得到了相同的结果


这种不一致性从何而来?

问题是节点的属性类型不是
string
。对于它们,无验证将给出
null
,这将给出
的错误,其中
是完整的。例如,此查询不返回任何内容:

WITH {k1: 1, k2: '2'} AS test 
WHERE NONE(key IN keys(test) WHERE test[key] CONTAINS '1')
RETURN test
因此,在这种情况下,您需要检查属性的类型。由于没有本机类型检查函数,因此可以从以下位置使用该函数:

@stdob——提供了对该问题的准确解释

但也有更简单的解决办法。例如,可以使用函数()强制将
NULL
值视为
FALSE

MATCH (n)
WHERE
  ANY ( p in KEYS(n) WHERE n[p] CONTAINS 'Tom' ) AND
  NONE( p in KEYS(n) WHERE COALESCE(n[p] CONTAINS 'Cruise', FALSE))
RETURN n