Graph 根据父节点和双向关系获取节点

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项吗?对 我知道我

我必须用Cypher解决一些“复杂”查询的问题。也许这对一个专家来说很简单,但我是一个完全的新手

有了这些关系,我需要知道如果给定一个项目列表和一个特定的项目,我是否可以使用它。 某些项允许使用其他项,而某些项需要(必需)项

示例(见图):

  • 如果我有A项,我可以用B项吗?对
  • 如果我有B项,我可以用D项吗?对
  • 如果我有B项,我可以用E项吗?否,因为项目C也是重新查询ID
  • 如果我有A项和B项,我可以使用E项吗?否,因为项目C也是重新查询ID
  • 如果我有A、B和C项,我可以使用E项吗?对
我知道我的项目列表,不是空的,例如:[“项目A”,“项目B'] 还有我需要的物品,比如:“D物品”

退货可以是Boolen或所需物品

可以使用以下方法创建图形:

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(*)