我正在使用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"]
]
]
}
}]}
它不会返回任何结果。为什么呢?
答案 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对我来说效果很好。