Cypher:模式的哪些部分可以绑定到变量?

时间:2014-10-17 15:59:51

标签: neo4j cypher

我可以像这样得到所有User个节点:

MATCH (n:User)
RETURN n

在这种情况下,n绑定到节点。但是,我想说我想编写一个Cypher查询,它获取标签为name的每个节点的User属性和一个带有键name的属性,并将其返回为username。我写道:

MATCH (n:User { name: username })
RETURN username

但这似乎是不可能的:Cypher解析器不接受模式的那个位置的标识符username。还有另一种方法吗?模式的哪些位置可以放置标识符?只是节点和关系?

(是的,我知道我可以绑定到节点,检查是否存在name属性,如果存在,则提取该值。但是直接在属性上进行模式匹配会更优雅。)

4 个答案:

答案 0 :(得分:3)

回答标题中提出的问题:

具体而言,在MATCH子句中,路径,节点和关系可以绑定到标识符:

MATCH p = (n)-[r]-(m)

MATCH子句之后,结合WITH子句,任何东西都可以绑定到标识符:

MATCH p = (n)-[r]-(m)
WITH n.name AS identifier

MATCH p = (n)-[r]-(m)
WITH COUNT(r) AS some_identifier

MATCH p = (n)-[r]-(m)
WITH EXTRACT(x IN NODES(p) | x.name) AS another_identifier

如果要将除路径,节点或关系之外的任何内容绑定到标识符,请使用WITH。您的具体示例似乎表明了对MATCH子句中花括号的作用的误解。它们适用于我喜欢称之为"速记WHERE条件。"花括号允许您对MATCH子句中的节点和关系属性进行条件化,而不是在后续WHERE子句中进行条件化。

MATCH (n:User {name:"Alice"})
RETURN n

MATCH (n:User)
WHERE n.name = "Alice"
RETURN n

是完全相同的。这是一个方便/偏好的问题。

TL; DR - 不,您不能将name属性绑定到username子句中的标识符MATCH。使用WITH n.name AS username执行此操作。

答案 1 :(得分:2)

您可以轻松返回节点的属性

MATCH (n:User)
RETURN n.name

您可以在任何表达式中访问这些属性

MATCH (n:User)
WHERE n.name = "John"
RETURN n.name

如果要将此属性分配给标识符,可以使用WITH

执行此操作
MATCH (n:User)
WITH n.name as userName   
RETURN userName

答案 2 :(得分:0)

编辑 - 实际答案
关于将变量绑定到匹配的属性,这是不可能的。就像你说绑定只适用于节点和关系。您还可以在Return语句和With子句中命名值。

值得注意的是,括号中的值用于选择节点(如WHERE子句),但仅适用于完全匹配。我不确定是否有任何路线图项目允许在括号内进行模式匹配,使其有效:

MATCH (n:User{name:"Jam.*"})
RETURN n

在以前的Neo迭代中(如果你愿意,你仍然可以)你可以使用START语义来根据Lucene索引进行索引匹配,但是也不允许属性绑定。

仍然您不需要测试属性的存在,因为缺少的属性无论如何都不匹配。正如你所推测的那样,你唯一的选择就是:

MATCH (n:User)
WHERE n.name =~ "James.*"
RETURN n.name AS username

或非正则表达式:

MATCH (n:User{name:"James"})
RETURN n.name AS username


原始答案
当然,如果您想匹配所有用户并返回值列表。

MATCH (n:User)
RETURN n.name AS username

或包含用户名数组的单个值:

MATCH (n:User)
RETURN COLLECT(n.name) AS usernames

或者如果您想匹配特定用户:

MATCH (n:User{propToMatch:"valToMatch"})
RETURN n.name AS username

括号中MATCH中的值与WHERE子句一样使用,而不是返回值。

答案 3 :(得分:0)

不,无法将属性值绑定到模式中的标识符。唯一可以绑定到模式中的标识符的是节点和关系。

实现相同查询的唯一方法是手动检查节点上是否存在属性键,并在密钥存在时提取属性值,如下所示:

MATCH (n:User)
WHERE HAS (n.name)
RETURN n.name AS username