我可以像这样得到所有User
个节点:
MATCH (n:User)
RETURN n
在这种情况下,n
绑定到节点。但是,我想说我想编写一个Cypher查询,它获取标签为name
的每个节点的User
属性和一个带有键name
的属性,并将其返回为username
。我写道:
MATCH (n:User { name: username })
RETURN username
但这似乎是不可能的:Cypher解析器不接受模式的那个位置的标识符username
。还有另一种方法吗?模式的哪些位置可以放置标识符?只是节点和关系?
(是的,我知道我可以绑定到节点,检查是否存在name
属性,如果存在,则提取该值。但是直接在属性上进行模式匹配会更优雅。)
答案 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