Graph 根据父节点和双向关系获取节点
我必须用Cypher解决一些“复杂”查询的问题。也许这对一个专家来说很简单,但我是一个完全的新手 有了这些关系,我需要知道如果给定一个项目列表和一个特定的项目,我是否可以使用它。 某些项允许使用其他项,而某些项需要(必需)项 示例(见图):Graph 根据父节点和双向关系获取节点,graph,neo4j,cypher,nodes,relationship,Graph,Neo4j,Cypher,Nodes,Relationship,我必须用Cypher解决一些“复杂”查询的问题。也许这对一个专家来说很简单,但我是一个完全的新手 有了这些关系,我需要知道如果给定一个项目列表和一个特定的项目,我是否可以使用它。 某些项允许使用其他项,而某些项需要(必需)项 示例(见图): 如果我有A项,我可以用B项吗?对 如果我有B项,我可以用D项吗?对 如果我有B项,我可以用E项吗?否,因为项目C也是重新查询ID 如果我有A项和B项,我可以使用E项吗?否,因为项目C也是重新查询ID 如果我有A、B和C项,我可以使用E项吗?对 我知道我
- 如果我有A项,我可以用B项吗?对
- 如果我有B项,我可以用D项吗?对
- 如果我有B项,我可以用E项吗?否,因为项目C也是重新查询ID
- 如果我有A项和B项,我可以使用E项吗?否,因为项目C也是重新查询ID
- 如果我有A、B和C项,我可以使用E项吗?对
MERGE (n:Item {name: 'Item A' });
MERGE (n:Item {name: 'Item B' });
MERGE (n:Item {name: 'Item C' });
MERGE (n:Item {name: 'Item D' });
MERGE (n:Item {name: 'Item E' });
MATCH (it: Item { name: 'Item A' })
MATCH (otherIt: Item { name: 'Item B' })
MERGE (it)-[:Enables]->(otherIt);
MATCH (it: Item { name: 'Item A' })
MATCH (otherIt: Item { name: 'Item C' })
MERGE (it)-[:Enables]->(otherIt);
MATCH (it: Item { name: 'Item B' })
MATCH (otherIt: Item { name: 'Item D' })
MERGE (it)-[:Enables]->(otherIt);
MATCH (it: Item { name: 'Item B' })
MATCH (otherIt: Item { name: 'Item E' })
MERGE (it)-[:Enables]->(otherIt);
MATCH (it: Item { name: 'Item C' })
MATCH (otherIt: Item { name: 'Item E' })
MERGE (it)-[:Enables]->(otherIt);
MATCH (it: Item {name: 'Item B'})
MATCH (req: Item {name: 'Item E'})
MERGE (req)-[:Requires]->(it);
MATCH (it: Item {name: 'Item C'})
MATCH (req: Item {name: 'Item E'})
MERGE (req)-[:Requires]->(it);
好的,这很难看:)基本上,我们确保所有需要的项目(从我们想要使用的项目的树上)和所有启用我们想要使用的项目的项目(也从树上)都在我们拥有的项目列表中可用。如果计数为零,则我们不能使用此项 希望如果这不是您的确切解决方案,那么它会给您带来一些新想法:) (顺便说一句,这不是我用cypher解决的问题,而是用Java作为一个过程解决的问题(反正我只需要2美分))
匹配(i:项目)
其中,i.名称位于[‘项目A’、‘项目B’、‘项目C’]
使用collect(distinct i)作为myItems
匹配(canIUseThis:Item{name:'Item E'})
使用myItems,可以使用此
匹配(canIUseThis)(y)
使用myItems、CanUseThis、enablers,按要求收集(不同的y)
匹配(canIUseThis)
where all(需求中的x,其中的x在myItems中)和all(启用码中的x,其中的x在myItems中)
返回计数(*)
match (i:Item)
where i.name in ['Item A','Item B','Item C']
with collect (distinct i) as myItems
match (canIUseThis:Item{name:'Item E'})
WITH myItems, canIUseThis
match (canIUseThis)<-[:Enables *1..]-(x)
WITH myItems, canIUseThis, COLLECT(DISTINCT x) as enablers
match (canIUseThis)-[:Requires *1..]->(y)
WITH myItems, canIUseThis, enablers, COLLECT(DISTINCT y) as reqs
match (canIUseThis)
where all(x in reqs where x in myItems) and all (x in enablers where x in myItems)
return count(*)