语法问题?在neo4j cypher语句中将对象作为参数传递

时间:2014-09-07 10:35:55

标签: rest neo4j parameter-passing cypher

我正在使用REST API运行这样的查询到事务端点:

{
   "statements" : [{"statement":"MATCH (n)-[r]-(m) WHERE id(n) IN {diagramnodes}  return     [type(r),labels(m)] ",
   "parameters" :{
       "diagramnodes" : [28]
    }}]
}

返回预期结果:

{
"commit": "http://myserver:7474/db/data/transaction/542/commit",
"results": [
    {
        "columns": [
            "[type(r),labels(m)]"
        ],
        "data": [
            {
                "row": [
                    [
                        "CONTAINS",
                        [
                            "Sentence"
                        ]
                    ]
                ]
            },
            {
                "row": [
                    [
                        "CONTAINS",
                        [
                            "Prologram",
                            "Diagram"
                        ]
                    ]
                ]
            },

            .......
        ]
    }
],
"transaction": {
    "expires": "Sun, 07 Sep 2014 17:50:11 +0000"
},
"errors": []
}

添加另一个参数和过滤器以限制返回的rels类型时:

{"statements": [{
"statement": "MATCH (n)-[r]-(m) WHERE id(n) IN {diagramnodes} AND [type(r),labels(m)] IN {includerels} return r ",
"parameters": {
    "diagramnodes": [28],
    "includerels": [
        [
            "CONTAINS",
            [
                "Prologram",
                "Diagram"
            ]
        ],
        [
            "HAS_TARGET",
            ["Term"]
        ]
    ]
}
}]}

它不会返回任何结果。为什么呢?

3 个答案:

答案 0 :(得分:1)

我找到了一种解决方法,通过连接reltype和标签,并将它与基本类型的集合进行比较。这是密码(添加了一些CRLF以便于阅读)

{
"statements" : [{"statement":"

MATCH (n)-[r]-(m) 
WHERE id(n) IN {diagramnodes} 
WITH type(r) as rtype, REDUCE(acc = '', p IN labels(m)| acc + ' '+ p) AS mlabels,m 
WITH rtype+mlabels As rtypemlabels,m 
WHERE rtypemlabels IN {includerels}  
RETURN rtypemlabels,id(m) ",

"parameters" :{
"diagramnodes" : [28],
"includerels": ["HAS_TARGET Term","CONTAINS Sentence","CONTAINS Prologram Diagram"]
}}]
}

注1:键入(r)+ REDUCE(acc ='',p IN标签(m)| acc +'' + p)不起作用,你有插入一个额外的WITH 注2:应该可以将嵌套对象的集合与IN子句进行比较,并保留在我的愿望清单中。 ;)

答案 1 :(得分:0)

IN操作很可能只适用于原始值的集合。

您可以尝试将其重写为ALL(x in coll WHERE expr(x))谓词。

输入如下:

[["CONTAINS",["Prologram","Diagram"]],
 ["HAS_TARGET",["Term"]]]

你可以尝试:

ALL(entry in {includerels} WHERE type(r) = entry[0] AND ALL(l in labels(n) WHERE l in entry[1])) 

答案 2 :(得分:0)

您可以在参数数组上使用UNWIND而不是IN。根据您的数据,您可能还必须使用DISTINCT。但UNWIND对我来说效果很好。