运行此查询时:
MATCH (profile:Profile)
MATCH (profile)-[:INTERACTION]->(i)
WHERE NOT 'foo' IN i.content
RETURN DISTINCT profile
即使我说过profile
,Neo仍将返回具有:INTERACTION
关系的i.content = foo
个节点,WHERE NOT
。
INTERACTION
节点结构如下:
[{
"content": String
}]
我错过了一步吗?
答案 0 :(得分:1)
IN
关键字仅用于测试值是否为列表的成员。例如: 5 IN [1,2,3] 。
要测试是否包含在字符串中,有几个选项。一种选择是使用CONTAINS关键字;例如: i.content包含'foo'。
注意:在您的查询中,i
是节点的变量,而不是关系。您实际上是在尝试测试关系的content属性吗?请更正您的问题,因为您目前似乎正在交替使用术语“节点”和“关系”。
答案 1 :(得分:1)
我认为您尚未在查询中明确定义想要的内容。
您要求与其内容属性中没有'foo'的节点具有:Interaction关系的:Profile节点。
这与要求:Profile节点与content属性中带有'foo'的节点没有任何关系的完全不同。
有几种方法可以得到想要的东西
MATCH (profile:Profile)
OPTIONAL MATCH (profile)-[:INTERACTION]->(i)
WHERE 'foo' IN i.content
WITH profile
WHERE i IS NULL
RETURN profile
或
MATCH (profile:Profile)
WITH profile, [(profile)-[:INTERACTION]->(i) WHERE 'foo' IN i.content | i] as fooInteractions
WHERE size(fooInteractions) = 0
RETURN profile
也正如cybersam指出的那样,您正在使用IN关键字进行列表中的成员资格检查,但您已经声明自己具有i.content = 'foo'
之类的值,因此您可能会误用它。
如果是这样,这将使正确的查询比上面的查询简单得多:
MATCH (profile:Profile)
WHERE NOT (profile)-[:INTERACTION]->(i {content:'foo'})
RETURN profile
并且正如cybersam所指出的那样,您的措辞表明,您实际上可能想检查:INTERACTION关系的content
属性。如果这确实是您想要的,则将{content:'foo'}
移至模式中的:INTERACTION关系。