Neo4j密码查询在collect中收集
我有一个问题:Neo4j密码查询在collect中收集,neo4j,match,cypher,Neo4j,Match,Cypher,我有一个问题: start brand=node(62) match brand-[:CREATED_A]->(campaign:Campaign)<-->(node) return DISTINCT brand,campaign,collect(node) ; start brand=node(62)匹配品牌-[:CREATED_A]->(活动:活动)(node) 返回不同的品牌、活动、收集(节点); 现在,结果几乎如我所愿。我缺少的一点是,我希望有以下层次结构:
start brand=node(62) match brand-[:CREATED_A]->(campaign:Campaign)<-->(node)
return DISTINCT brand,campaign,collect(node) ;
start brand=node(62)匹配品牌-[:CREATED_A]->(活动:活动)(node)
返回不同的品牌、活动、收集(节点);
现在,结果几乎如我所愿。我缺少的一点是,我希望有以下层次结构:
品牌有很多活动,活动有很多节点与之相连,所以品牌活动中的节点
现在,该活动将多次返回到正在返回的每个活动 我提供了一个示例,说明了解决方案。简而言之,它使用文字映射来格式化数据,并收集两个数据,以确保品牌不会出现多次
MATCH
(brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
WITH
brand,
{
campaign : campaign,
nodes : COLLECT(node)
} AS campaigns
WITH
{
brand : brand,
campaigns : COLLECT(campaigns)
} AS brands
RETURN brands
匹配
(品牌:品牌)-[:创建的\-A]->(活动:活动)(节点)
具有
品牌,
{
运动:运动,
节点:收集(节点)
}作为运动
具有
{
品牌:品牌,,
活动:收集(活动)
}作为品牌
回归品牌
这使得品牌只出现一次,您就可以获得一个很好的输出格式。Cypher是一种非常强大的语言。如果您知道要从节点获取哪些属性,甚至可以返回类似json的输出,该输出还可以维护图形中实际建模的结构,您可以执行以下操作:
MATCH (brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
WITH
brand,
campaign as campaign,
COLLECT({
property1 : node.property1,
property2 : node.property2
}) as nodes
RETURN
{
name : brand.name,
logoUrl : brand.logoUrl,
campaigns : COLLECT({
name : campaign.name,
timestamp : campaign.timestamp,
nodes : nodes
})
} as brands
这实际上很好地反映了您的图形模型
此外,由于您没有执行RETURN-COLLECT(…),这允许您迭代记录结果,而不是获取第一条(并且只有一条)记录并将所有行放入其中。当您处于嵌入式服务器这样的情况时,这可能是一种方便的方法,在这种情况下,您实际上可以流式传输结果数据,而不是一次性检索结果数据
即使您没有任何集合(例如,一个活动只有一个节点),而且如果路径变得更深,这种方法也可以很好地工作。
然而,当您的模型是一棵树(或者更糟糕的是,是一个图形)时,您可能会遇到挑战
您可以在以下要点中找到更多详细信息:
[
{
name : "my name",
logoUrl : "http://www...",
campaigns : [
{
name : "my campaign name",
timestamp : 1484172044462,
nodes : [
{
property1 : "property1",
property2 : "property2"
}
]
}
]
}
]