这是我的Neo4j数据库模型的简化模式。 我根据一些帖子尝试了几个Cypher查询,但没有任何效果。
我想找一个自行车号码的所有组件和所有供应商。
复杂性是某些组件与供应商相关联,在这种情况下,仅当上层组件具有正确的版本时才会遵循分支。
示例:
我想获得节点和关系。
有人可以帮助我吗?
答案 0 :(得分:3)
这是一个简单的数据模型。除了Bike
,Component
和Supplier
节点标签之外,此模型还会添加Part
节点标签。
(b:Bike)-[HAS_COMPONENT]->(c:Component)-[:IS_PART]->(p:Part)
(c)-[:SUPPLIED_BY]->(s:Supplier)
在这个模型中:
Part
是特定制造商生产的特定商品,可以按任意数量的Supplier
销售。Bike
由多个Component
组成,每个Part
都是从特定Supplier
购买的MATCH
(:Bike {id: 1})-[HAS_COMPONENT]->(c)-[:IS_PART]->(part),
(c)-[:SUPPLIED_BY]->(supplier)
RETURN part, supplier;
。使用此模型,以下是针对特定自行车,每个组件部件及其供应商返回的示例查询:
list = ['3a', '13a', '5a', '11a']
list.sort(key=lambda x: int(x[:-1]))
答案 1 :(得分:1)
不确定我是否理解正确,但这会有效吗?
MATCH p=(b:Bike {bnumber = 6})-[hc:HAS_COMPONENT]-(c:Component)-[hs:HAS_SUPPLIER]-(s:Supplier)
WHERE hs.frombike >= bnumber
AND hs.tobike <= bnumber
RETURN p;
我同意@cybersam的说法,你可以简化模型。提出这个担忧。
希望这有帮助。
此致 汤姆
答案 2 :(得分:0)
基本上,您想要的是拉出所有子图项,但过滤掉过滤器失败的关系路径。您可以使用ALL / NONE / ANY来确保拾取的路径不违反任何约束。
这是一个假设可以独立定义from和to的示例,但我认为可以根据需要调整您的需求。 (注意:您也可以使用TYPE(r)
检查关系类型名称)
WITH 11 as num
MATCH p=(s:Bike)-[*..25]-(n)
WHERE
ALL(r IN RELATIONSHIPS(p) WHERE
(NOT EXISTS(r.RANGEFROM) OR toInteger(r.RANGEFROM) <= num) AND
(NOT EXISTS(r.RANGETO) OR num <= toInteger(r.RANGETO)))
AND TYPE(RELATIONSHIPS(p)[-1]) = "LO"
WITH NODES(p) as ns, RELATIONSHIPS(p) as rs
UNWIND ns as n UNWIND rs as r
RETURN COLLECT(DISTINCT n), COLLECT(DISTINCT r)
或者这应该更有效率。
WITH 11 as num
MATCH (ci)-[lo:LO]->(ds)
WHERE toInteger(lo.RANGEFROM) <= num <= toInteger(lo.RANGETO)
WITH ds, COLLECT(lo) as lo
MATCH p=shortestpath((b:Bike)-[*..25]->(ds))
WHERE ALL(r IN RELATIONSHIPS(p) WHERE TYPE(r) <> "LO" OR r in lo)
WITH NODES(p) as ns, RELATIONSHIPS(p) as rs
UNWIND ns as n UNWIND rs as r
RETURN COLLECT(DISTINCT n), COLLECT(DISTINCT r)
注意:如果您需要更好的性能,可能需要考虑使用Neo4J Traversal API。