Neo4j Cypher-具有可选匹配的聚合
我在数据库中有以下节点结构:Neo4j Cypher-具有可选匹配的聚合,neo4j,cypher,Neo4j,Cypher,我在数据库中有以下节点结构: Artifact {id:'art1'} |ArtifactProperty {key:'prop1_1', value:1} |ArtifactProperty {key:'prop1_2', value:2} =Artifact {id:'art1_1'} =|ArtifactProperty {key:'prop1_1_1', value:1} =|ArtifactProperty {key:'prop1_1_2', value:2} ==Artifact {
Artifact {id:'art1'}
|ArtifactProperty {key:'prop1_1', value:1}
|ArtifactProperty {key:'prop1_2', value:2}
=Artifact {id:'art1_1'}
=|ArtifactProperty {key:'prop1_1_1', value:1}
=|ArtifactProperty {key:'prop1_1_2', value:2}
==Artifact {id:'art1_1_1'}
==|ArtifactProperty {key:'prop1_1_1_1', value:1}
==|ArtifactProperty {key:'prop1_1_1_2', value:2}
==Artifact {id:'art1_1_2'}
==|ArtifactProperty {key:'prop1_1_2_1', value:1}
==|ArtifactProperty {key:'prop1_1_2_2', value:2}
==Artifact {id:'art1_1_3'}
==|ArtifactProperty {key:'prop1_1_3_1', value:1}
==|ArtifactProperty {key:'prop1_1_3_2', value:2}
其中,工件是可以通过当前关系和/或工件属性(也可以通过当前关系)与其他工件节点相关的节点。当前关系保存根的id
我的目标是获取所有工件及其子对象和属性
请求如下:
MATCH (a:Artifact)-[:CURRENT {root: 'art1'}]->(c:ArtifactProperty)
OPTIONAL MATCH (a:Artifact)-[:CURRENT {root: 'art1'}]->(b:Artifact)
WITH a {.id, children: collect(b {.id}), properties: collect(c {.key, .value})} as mapped
return mapped.id, mapped.children, mapped.properties
提供以下结果:
╒═══════════╤══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╕
│"mapped.id"│"mapped.children" │"mapped.properties" │
╞═══════════╪══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╡
│"art1_1" │[{"id":"art1_1_3"},{"id":"art1_1_2"},{"id":"art1_1_1"},{"id":"art1_1_3│[{"value":1.0,"key":"prop_1_1_1"},{"value":1.0,"key":"prop_1_1_1"},{"v│
│ │"},{"id":"art1_1_2"},{"id":"art1_1_1"}] │alue":1.0,"key":"prop_1_1_1"},{"value":2.0,"key":"prop_1_1_2"},{"value│
│ │ │":2.0,"key":"prop_1_1_2"},{"value":2.0,"key":"prop_1_1_2"}] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_1" │[] │[{"value":1.0,"key":"prop_1_1_1_1"},{"value":2.0,"key":"prop_1_1_1_2"}│
│ │ │] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1" │[{"id":"art1_1"},{"id":"art1_1"}] │[{"value":1.0,"key":"prop_1_1"},{"value":2.0,"key":"prop_1_2"}] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_2" │[] │[{"value":1.0,"key":"prop_1_1_2_1"},{"value":2.0,"key":"prop_1_1_2_2"}│
│ │ │] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_3" │[] │[{"value":1.0,"key":"prop_1_1_2_1"},{"value":2.0,"key":"prop_1_1_2_2"}│
│ │ │]
问题是,对于具有子对象的人工制品,重复我的结果(properties和children字段包含两次相同的结果)
可能有更好的方法来执行此聚合,而不是进行可选匹配,因此如果我没有选择最佳选项,请告诉我
编辑:
这是我试图得到的结果,请注意,每个子级和属性只出现一次:
╒═══════════╤══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╕
│"mapped.id"│"mapped.children" │"mapped.properties" │
╞═══════════╪══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╡
│"art1_1" │[{"id":"art1_1_3"},{"id":"art1_1_2"},{"id":"art1_1_1"}] │[{"value":1.0,"key":"prop_1_1_1"},{"value":2.0,"key":"prop_1_1_2"} │
│ │ │ │
│ │ │ │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_1" │[] │[{"value":1.0,"key":"prop_1_1_1_1"},{"value":2.0,"key":"prop_1_1_1_2"}│
│ │ │] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1" │[{"id":"art1_1"}] │[{"value":1.0,"key":"prop_1_1"},{"value":2.0,"key":"prop_1_2"}] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_2" │[] │[{"value":1.0,"key":"prop_1_1_2_1"},{"value":2.0,"key":"prop_1_1_2_2"}│
│ │ │] │
├───────────┼──────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┤
│"art1_1_3" │[] │[{"value":1.0,"key":"prop_1_1_2_1"},{"value":2.0,"key":"prop_1_1_2_2"}│
│ │ │]
尝试使用:
你想要的确切结果是什么?这些类型的问题最有可能通过使用可变模式长度的查询来解决。您想要实现什么还不清楚。这是什么意思?问题是,我的结果对于带有子对象的工件是重复的(属性和子字段包含两次相同的结果)您好,我想获取所有工件作为{id:,children:[,child artifact id2>,…],properties:[,]}我已经添加了我试图在questionPerfect中获得的结果,这正是我想要的。
MATCH (a:Artifact)-[:CURRENT {root: 'art1'}]->(c:ArtifactProperty)
OPTIONAL MATCH (a:Artifact)-[:CURRENT {root: 'art1'}]->(b:Artifact)
WITH a {
.id,
children: collect(DISTINCT b {.id}),
properties: collect(DISTINCT c {.key, .value})
} AS mapped
RETURN mapped.id, mapped.children, mapped.properties