Neo4j:哪里没有返回不正确的节点

时间:2018-08-31 17:26:19

标签: neo4j

运行此查询时:

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
}]

我错过了一步吗?

2 个答案:

答案 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关系。