如何使用Cypher返回节点的所有属性?

33

我了解在Cypher查询中可以使用通配符 (*) 符号来返回所有的引用,例如:

MATCH p:Product WHERE p.price='1950' RETURN *;

  ==> +----------------------------------------------------------------+
  ==> | p                                                              |
  ==> +----------------------------------------------------------------+
  ==> | Node[686]{title:"Giorgio Armani Briefcase",price:"1950",...    |
  ==> +----------------------------------------------------------------+
然而,结果是一个只有一个名为"p"的节点'column'的行,可以从中访问属性。然而,我希望结果集'rows'的属性名称为'columns'。类似这样:
MATCH p:Product WHERE p.price='1950' RETURN p.*;

  ==> +-------------------------------------------+
  ==> | title | price | ...                       |
  ==> +-------------------------------------------+
  ==> | "Giorgio Armani Briefcase" | "1950" | ... |
  ==> +-------------------------------------------+

那个特定的查询无效,但是否有一种方法可以实现相同的结果(除了显式列出所有属性,例如p.title,p.price,p...)?


1
只需执行 MATCH (n:People) n,它将给出所有属性。 - Ravindra Gupta
7个回答

32

目前在Cypher中还不能做到这一点。不过我认为这将是一个不错的功能,如果您想请求它的话。

编辑(感谢评论指出):自2.2版本起,您现在可以做到这一点:

MATCH (p:Product) WHERE p.price='1950' RETURN keys(p);

1
看起来是这样的:https://github.com/neo4j/neo4j/issues/164 和 https://trello.com/c/FciCdgWl - Eve Freeman
3
您可以使用2.2版本中引入的keys函数获取键的集合,但无法像此处所需的那样使用动态字符串键访问属性 :( https://dev59.com/zorda4cB1Zd3GeqPLmOy - Matt Byrne
7
你对这个答案的2015年更新有些混淆。KEYS()并不是这个问题所要求的;你最初的回答仍然是正确的,你的编辑只会增加混淆。 - Mark Amery
抱歉 @MarkAmery -- 我明白你的意思了。(两年后, :/) - Eve Freeman

27
在最新版本的Cypher中,properties(n)将返回节点的所有键和属性。不过好像只适用于单个节点。
希望这能帮到大家。

这是实际更新的答案,因为 properties(NODE) 只适用于此类问题,仅从查询中返回节点的属性(而不包括所有节点元数据)。 - Itay Wolfish

12

只是为了详细说明如何获取密钥:

MATCH (p:product) WITH DISTINCT keys(p) AS keys
UNWIND keys AS keyslisting WITH DISTINCT keyslisting AS allfields
RETURN allfields;

4

这篇博客文章是展现如何在Neo4J中操作结果的一个很好的样例。

如果您只想要获取键,上述响应即可。

如果您只想要获取属性对象而不包括其他信息,则可以使用以下语句:

"identity": 16,
"labels": ["Post"],
"properties": { ... }

你可以做:

MATCH p:Product WHERE p.price='1950' RETURN p{.*};

这里是一个涉及列表的高级示例:

MATCH (post:Post)-[:HAS_JOB]-(job)
OPTIONAL MATCH(post)-[:HAS_LIKE]-(like)
OPTIONAL MATCH (post)-[:HAS_USER]-(user)
WITH post, job, user, collect(like{.*}) as likes
RETURN post{
    .*,
    likes: likes,
    job: job{.*},
    user: user{.*}
};

示例结果:

{
    "id": "ec704f3b-ce10-4f23-bd06-6d668b7db488",
    "title": "Science Summer"
    "job": {
            "id": "81ae08e4-57d6-4997-9cb8-407e13bc30c6",
            ...
        },
    "user": null,
    "likes": [
        {
            "id": "2209e3a9-701d-4842-9d6b-d4dc8428bac6",
            "name": "alex",
            ...
        }
    ],
}

这与JavaScript展开运算符非常相似。

2

你可以在Cypher查询中返回n,它将返回节点的所有键和属性。 例如:

MATCH (n:People) n

这将返回
n:
{
  "Date_of_Birth": "1981-04-23 00:00:00",
  "Employee_Last_Name": "Aaaa",
  "Employee_First_Name": "Baaa",
  "Age": 36,
  "Employee_Status": "Active"
 }

1
您可以使用“as”子句并标识每个属性及其所需的列名。但是,您需要逐个标识要返回的每个属性。
例如:
MATCH p.product where WHERE p.price='1950' RETURN p.price as price, p.title as title, p.whatever, as anythingYouWant

3
谢谢您的提示。恰好我的代码是由生成器生成的,所以生成器静态地知道属性名称,并生成了类似于这样的内容 - 但对于'可为空'(缺失)属性,使用 p.price? as price 进行生成。 - DavidJ

0

我对Cypher还不熟悉,但似乎这会返回特定类型节点的所有键:

MATCH (p:product) RETURN keys(p)

适用于Neo4J 3.0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接