我需要Neo4j查询的帮助

时间:2017-08-12 19:04:08

标签: neo4j cypher

这是我的Neo4j数据库模型的简化模式。 我根据一些帖子尝试了几个Cypher查询,但没有任何效果。

My Neo4j Model Example

我想找一个自行车号码的所有组件和所有供应商。

复杂性是某些组件与供应商相关联,在这种情况下,仅当上层组件具有正确的版本时才会遵循分支。

示例:

  • 自行车编号6的组件ID = 3,供应商ID = 3,组件ID = 1,供应商ID = 1
  • 自行车编号1的组件ID = 1,供应商ID = 2
  • 自行车编号3的组件ID = 1,供应商ID = 2,组件ID = 2,供应商ID = 3

我想获得节点和关系。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

这是一个简单的数据模型。除了BikeComponentSupplier节点标签之外,此模型还会添加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