【问题标题】:How can I return all properties for a node using Cypher?如何使用 Cypher 返回节点的所有属性?
【发布时间】:2013-07-18 02:02:13
【问题描述】:

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

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

  ==> +----------------------------------------------------------------+
  ==> | p                                                              |
  ==> +----------------------------------------------------------------+
  ==> | Node[686]{title:"Giorgio Armani Briefcase",price:"1950",...    |
  ==> +----------------------------------------------------------------+

但是,结果是一行包含一个名为“p”的节点“列”,可以从中访问属性。但是,我希望结果集“行”的属性名称为“列”。比如:

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

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

该特定查询无效,但有没有办法获得相同的结果(没有明确列出所有属性,如 p.title,p.price,p... )?

【问题讨论】:

  • 只要MATCH (n:People) n它会给你所有的财产

标签: graph neo4j cypher


【解决方案1】:

您可以在密码查询中返回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"
 }

【讨论】:

    【解决方案2】:

    This blog post 是在 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 spread operator非常相似。

    【讨论】:

      【解决方案3】:

      您还不能在 Cypher 中执行此操作。我认为这将是一个不错的功能,如果你想请求它。

      编辑(感谢评论指出): 您现在可以从 2.2 开始执行此操作:

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

      【讨论】:

      【解决方案4】:

      在最新版本的 cypher 中,properties(n) 将返回节点的所有键和属性。不过似乎只适用于单个节点。

      我希望这对人们有所帮助。

      【讨论】:

        【解决方案5】:

        只是为了扩展获取密钥:

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

        【讨论】:

          【解决方案6】:

          我是 cypher 的新手,但似乎这会返回特定类型节点的所有键:

          MATCH (p:product) RETURN keys(p)
          

          在 Neo4J 3.0 中工作。

          【讨论】:

            【解决方案7】:

            您可以使用“as”子句并标识每个属性以及您希望为列命名的内容。不过,您必须确定要单独返回的每个属性。

            例如:

            MATCH p.product where WHERE p.price='1950' RETURN p.price as price, p.title as title, p.whatever, as anythingYouWant
            

            【讨论】:

            • 感谢您的提示。碰巧的是,生成了我的代码,因此生成器静态地知道属性名称,我让它生成类似这样的东西 - 尽管使用 p.price? as price 来表示“可空”(不存在)属性。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多