Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 如何动态命名集合?_Syntax_Neo4j_Cypher - Fatal编程技术网

Syntax 如何动态命名集合?

Syntax 如何动态命名集合?,syntax,neo4j,cypher,Syntax,Neo4j,Cypher,标题:如何动态命名集合 伪代码:collect(n)AS:Label 其主要目的是方便读取API服务器(节点应用程序)中的属性 详细示例: MATCH (user:User)--(n) WHERE n:Movie OR n:Actor RETURN user, CASE WHEN n:Movie THEN "movies" WHEN n:Actor THEN "actors" END as type, collect(n) as :type [{ "user": {

标题:如何动态命名集合

伪代码:
collect(n)AS:Label

其主要目的是方便读取API服务器(节点应用程序)中的属性

详细示例:

MATCH (user:User)--(n)
WHERE n:Movie OR n:Actor
RETURN user,
CASE
    WHEN n:Movie THEN "movies"
    WHEN n:Actor THEN "actors"
END as type, collect(n) as :type
[{
    "user": {
        ....
    },


    "movies": [
        {
            "_id": 1987,
            "labels": [
                "Movie"
            ],
            "properties": {
                ....
            }
        }
    ],

    "actors:" [ .... ]
}]


JSON中的预期输出:

MATCH (user:User)--(n)
WHERE n:Movie OR n:Actor
RETURN user,
CASE
    WHEN n:Movie THEN "movies"
    WHEN n:Actor THEN "actors"
END as type, collect(n) as :type
[{
    "user": {
        ....
    },


    "movies": [
        {
            "_id": 1987,
            "labels": [
                "Movie"
            ],
            "properties": {
                ....
            }
        }
    ],

    "actors:" [ .... ]
}]
我得到的最接近的结果是:

目标是能够像这样轻松地读取JSON结果:

neo4j.cypher.query(statement, function(err, results) {
    for result of results
    var user = result.user
    var movies = result.movies
}
编辑:
对于我无法正确命名数据库语义的任何混淆,我深表歉意

此查询应返回每个
用户
及其相关电影和演员(在单独的集合中):


此查询应返回每个
用户
及其相关电影和演员(在单独的集合中):


我想知道仅仅输出用户和他们的演员和电影列表是否足够,而不是尝试进行更复杂的匹配和组合

MATCH (user:User)
OPTIONAL MATCH (user)--(m:Movie)
OPTIONAL MATCH (user)--(a:Actor)
RETURN user, COLLECT(m) as movies, COLLECT(a) as actors

我想知道仅仅输出用户和他们的演员和电影列表是否足够,而不是尝试进行更复杂的匹配和组合

MATCH (user:User)
OPTIONAL MATCH (user)--(m:Movie)
OPTIONAL MATCH (user)--(a:Actor)
RETURN user, COLLECT(m) as movies, COLLECT(a) as actors

就您的问题的动态解决方案而言,该解决方案适用于连接到您用户的任何节点,有几个选项,但我不相信您可以让列名像这样动态,甚至返回的集合的名称,尽管我们可以将它们与类型相关联

MATCH (user:User)--(n)
WITH user, LABELS(n) as type, COLLECT(n) as nodes
WITH user, {type:type, nodes:nodes} as connectedNodes
RETURN user, COLLECT(connectedNodes) as connectedNodes
或者,如果希望使用多行,则每个节点类型一行:

MATCH (user:User)--(n)
WITH user, LABELS(n) as type, COLLECT(n) as collection
RETURN user, {type:type, data:collection} as connectedNodes

请注意,
LABELS(n)
返回标签列表,因为节点可以有多个标签。如果保证每个感兴趣的节点都有一个标签,那么可以使用列表的第一个元素,而不是列表本身。只要使用标签(n)[0]就可以了。

对于您的问题的动态解决方案,一个可以与您的用户连接的任何节点一起使用的解决方案,有几个选项,但是我不相信您可以让列名像这样动态,甚至是返回的集合的名称,尽管我们可以将它们与类型关联

MATCH (user:User)--(n)
WITH user, LABELS(n) as type, COLLECT(n) as nodes
WITH user, {type:type, nodes:nodes} as connectedNodes
RETURN user, COLLECT(connectedNodes) as connectedNodes
或者,如果希望使用多行,则每个节点类型一行:

MATCH (user:User)--(n)
WITH user, LABELS(n) as type, COLLECT(n) as collection
RETURN user, {type:type, data:collection} as connectedNodes

请注意,
LABELS(n)
返回标签列表,因为节点可以有多个标签。如果保证每个感兴趣的节点都有一个标签,那么可以使用列表的第一个元素,而不是列表本身。只需使用标签(n)[0]。

您可以按标签动态排序节点,然后使用以下命令转换为地图:


可以按标签动态排序节点,然后使用以下命令转换为地图:



当有相关电影和演员时,你能加上对输出的期望吗?你会同时得到两个在同一排…我不知道我是否理解你。每当我在一个工作数据集上尝试此操作时,collect(n)都会设法将这两个集放入两个不同的数组中,这就是为什么我需要动态地命名该数组集,而不是在返回的数据中将其命名为collect(n)。我正在寻找的是一种执行var movies=response.movies等的方法。我已经更新了示例,希望能够澄清预期的输出。谢谢。是的,你是对的(我错了),类型输出的存在很好地将电影和演员分成了不同的行,尽管这似乎不是你想要它做的…两个不同的行是可以接受的,只要我可以在nodejs中按属性名对它们进行排序。目前,数组名只是
collect(n)
当同时有相关电影和演员时,您是否可以添加对输出的期望?你会同时得到两个在同一排…我不知道我是否理解你。每当我在一个工作数据集上尝试此操作时,collect(n)都会设法将这两个集放入两个不同的数组中,这就是为什么我需要动态地命名该数组集,而不是在返回的数据中将其命名为collect(n)。我正在寻找的是一种执行var movies=response.movies等的方法。我已经更新了示例,希望能够澄清预期的输出。谢谢。是的,你是对的(我错了),类型输出的存在很好地将电影和演员分成了不同的行,尽管这似乎不是你想要它做的…两个不同的行是可以接受的,只要我可以在nodejs中按属性名对它们进行排序。目前,数组名只是
collect(n)
感谢您提供答案。虽然这不是我要找的。我基本上只想按动态属性名称(标签)对集合进行排序,您想按标签排序吗?你能解释一下这是什么意思吗?谢谢你的回答。虽然这不是我要找的。我基本上只想按动态属性名称(标签)对集合进行排序,您想按标签排序吗?你能澄清一下这意味着什么吗?这个请求,如书面所示,将无法返回任何内容,除非用户与电影和演员都有关联。@cybersam感谢您的关注!更新为使用可选匹配。这正是我要找的。非常感谢你!我同意这是最好的答案。但是我应该提到,我的答案(虽然更复杂)应该返回相同的集合。它不会找到通过:Movie节点的路径,这不在匹配条件中(表示单个关系,尽管它可以是任何类型的关系)。出现多个匹配项的原因是与演员(或电影)的多个关系。例如,如果用户导演并制作了一部电影,电影将出现两次。如果用户知道并喜欢某个演员,则会出现两次。在收藏中添加DISTINCT可确保在收藏中只出现一次该内容。此请求(如书面所述)将无法返回任何内容,除非用户与电影和演员都有关联。@cybersam感谢您的关注!更新为使用可选匹配。这正是我要找的。Th