Neo4j 具有多个匹配语句的Cypher查询并返回COLLECT数组
我有一个特定的密码查询问题,我希望有人能帮助我。我试图查询父对象的不同关系类型,以便返回一个响应,该响应包括父对象的id、名称和节点标签的一些键/值对,同时还返回子对象数组作为返回的同一对象中的另一个键/值对。子数组来自第二个关系匹配集。当我运行这个程序时,数组中的元素数量要比与父级的关系支持的元素数量大得多(大约100个元素,而不是预期的三个) 以下是我希望最终产生的json输出:Neo4j 具有多个匹配语句的Cypher查询并返回COLLECT数组,neo4j,cypher,Neo4j,Cypher,我有一个特定的密码查询问题,我希望有人能帮助我。我试图查询父对象的不同关系类型,以便返回一个响应,该响应包括父对象的id、名称和节点标签的一些键/值对,同时还返回子对象数组作为返回的同一对象中的另一个键/值对。子数组来自第二个关系匹配集。当我运行这个程序时,数组中的元素数量要比与父级的关系支持的元素数量大得多(大约100个元素,而不是预期的三个) 以下是我希望最终产生的json输出: { "id" : "839930493049039430"
{
"id" : "839930493049039430",
"name" : "lorem",
"type" : "epsim",
"rel_one_representation" : {
"keystring" : {
"id" : "839930493049039430_all",
"count" : 7
}
},
"rel_two_representation" : [
{
"name" : "barker"
},
{
"name" : "bird"
},
{
"name" : "tiki"
}
]
}
提前感谢您提供的任何指导。您的查询的问题是,它返回了
子节点1
和子节点2
的所有可能对的结果。这导致每个children\u-two
节点重复N1次,其中N1是children\u-one
节点的数量。它还导致每个子节点\u-one
重复N2次,其中N2是子节点\u-two
节点的数量
解决方案1:
这种方法使用WITH
来分隔两个MATCH
子句,以避免“配对效应”
解决方案2:
这种方法使用DISTINCT
关键字来过滤重复项
{
"id" : "839930493049039430",
"name" : "lorem",
"type" : "epsim",
"rel_one_representation" : {
"keystring" : {
"id" : "839930493049039430_all",
"count" : 7
}
},
"rel_two_representation" : [
{
"name" : "barker"
},
{
"name" : "bird"
},
{
"name" : "tiki"
}
]
}
MATCH (n)-[relone:RELATIONSHIP_ONE]->(children_one)
WHERE n.id='839930493049039430'
WITH n, COUNT(relone) AS cnt
MATCH (n)-[reltwo:RELATIONSHIP_TWO]->(children_two)
RETURN n.id AS id, n.name AS name, LABELS(n)[0] AS type, { keystring: { id: (n.id + '_all'), count: cnt }} AS rel_one_representation, COLLECT({ name : children_two.name }) AS rel_two_representation
MATCH (n)-[relone:RELATIONSHIP_ONE]->(children_one),(n)-[reltwo:RELATIONSHIP_TWO]->(children_two)
WHERE n.id='839930493049039430'
RETURN n.id AS id, n.name AS name, LABELS(n)[0] AS type, { keystring: { id: (n.id + '_all'), count: COUNT(DISTINCT relone)}} AS rel_one_representation, COLLECT(DISTINCT { name: children_two.name }) AS rel_two_representation