Database 如何从节点';用Cypher Neo4j中的其他道具替换道具?
我将描述我的数据模型,以及我想要实现的一些事情。 我有Neo4j作为数据库,数据结构目前是不变的,所以像“只需创建标签已更改的其他节点”这样的建议不适合我的情况,事先我很抱歉 在Neo4j中,我有Database 如何从节点';用Cypher Neo4j中的其他道具替换道具?,database,neo4j,cypher,Database,Neo4j,Cypher,我将描述我的数据模型,以及我想要实现的一些事情。 我有Neo4j作为数据库,数据结构目前是不变的,所以像“只需创建标签已更改的其他节点”这样的建议不适合我的情况,事先我很抱歉 在Neo4j中,我有节点:类别,节点:商品,节点:属性。货物可能与财产有许多关系。例如:(:Goods{name:“Chair”})-[:PROP]-(:Property)。此节点:商品与两个节点:属性价格和物料相关。正如您可能已经猜到的那样,我有很多节点:商品,每一个都与价格和材料相关节点:属性 我需要为此结构构建前端客
节点:类别
,节点:商品
,节点:属性
。货物可能与财产有许多关系。例如:(:Goods{name:“Chair”})-[:PROP]-(:Property)
。此节点:商品
与两个节点:属性
价格和物料相关。正如您可能已经猜到的那样,我有很多节点:商品
,每一个都与价格和材料相关节点:属性
我需要为此结构构建前端客户端,能够通过相关的
节点:属性
过滤节点:商品
。例如,我需要所有与Node:Property
相关的Node:Property
和{name:“Price”}
和{value:>40,在处理num
属性时,只需使用min()
和max()
聚合函数
针对这三种变体,您可以使用如下查询:
{
"name":"Price",
"type":"num", //text, bool
"value":245
}
MATCH (good:Good)
WITH good
OPTIONAL MATCH (good)-[:PROP]-(p:Property {type:'text'})
WITH good, p.name as name, collect(p.value) as variants
WITH good, collect({name:name, type:'text', variants:variants}) as properties
OPTIONAL MATCH (good)-[:PROP]-(p:Property {type:'num'})
WITH good, properties, p.name as name, min(p.value) as min, max(p.value) as max
WITH good, properties + collect({name:name, type:'num', min:min, max:max}) as properties
WITH good, properties + [(good)-[:PROP]-(p:Property {type:'bool'}) | p {.name, type:'bool'}] as properties
RETURN good, properties
处理num
type:Properties时,只需使用min()
和max()
聚合函数即可
针对这三种变体,您可以使用如下查询:
{
"name":"Price",
"type":"num", //text, bool
"value":245
}
MATCH (good:Good)
WITH good
OPTIONAL MATCH (good)-[:PROP]-(p:Property {type:'text'})
WITH good, p.name as name, collect(p.value) as variants
WITH good, collect({name:name, type:'text', variants:variants}) as properties
OPTIONAL MATCH (good)-[:PROP]-(p:Property {type:'num'})
WITH good, properties, p.name as name, min(p.value) as min, max(p.value) as max
WITH good, properties + collect({name:name, type:'num', min:min, max:max}) as properties
WITH good, properties + [(good)-[:PROP]-(p:Property {type:'bool'}) | p {.name, type:'bool'}] as properties
RETURN good, properties
您可以在聚合时使用用例:
MATCH (C:Category)
OPTIONAL MATCH (C)-[:Good]->(G:Goods)-[:Prop]->(P:Property)
WITH C,
count(DISTINCT G) AS cnt,
P.Name AS name, P.type AS type,
CASE WHEN P.type = "num" THEN min(P.value) ELSE null END AS min,
CASE WHEN P.type = "num" THEN max(P.value) ELSE null END AS max,
CASE WHEN P.type = "text" THEN collect(P.value) ELSE null END AS variants
WITH C.name AS name, cnt,
{name: name, type: type, min: min, max: max, variants: variants } AS prop
RETURN {Category: name, Goods: cnt, Properties: collect(prop)} AS category
您可以在聚合时使用用例:
MATCH (C:Category)
OPTIONAL MATCH (C)-[:Good]->(G:Goods)-[:Prop]->(P:Property)
WITH C,
count(DISTINCT G) AS cnt,
P.Name AS name, P.type AS type,
CASE WHEN P.type = "num" THEN min(P.value) ELSE null END AS min,
CASE WHEN P.type = "num" THEN max(P.value) ELSE null END AS max,
CASE WHEN P.type = "text" THEN collect(P.value) ELSE null END AS variants
WITH C.name AS name, cnt,
{name: name, type: type, min: min, max: max, variants: variants } AS prop
RETURN {Category: name, Goods: cnt, Properties: collect(prop)} AS category