【问题标题】:Neo4J find unique resultsNeo4J 发现独特的结果
【发布时间】:2014-01-05 22:03:46
【问题描述】:

我有一个图表,显示公司之间的财务关系 - 欠款的关系,即公司欠公司的钱。我 寻求 一个 独特 的 关系 —— 圈子 , 后者 是 封闭 的 . 所以 如果 我 欠 你 钱 , 我们 发现 不知何故 你 欠 我 钱 我 就 结清 债务 .这些公司由税号标识。为此,我使用了这个 Cypher 查询:

start n=node(*) 
match p=n-[r:OWES*1..200]->n 
where HAS(n.taxnumber) 
return  extract(s in relationships(p) : s.amount), 
        extract(t in nodes(p) : ID(t)), 
        length(p) ;

但我也得到类似的结果

Company1-Company2-company1-Company-3

我在我的 java 应用程序中显示这个结果。在我用 java 代码解析它们之后,我是否应该隐藏这些结果 - 结果显示一家公司两次。 这在逻辑上很好,但我需要一个公司只显示一次的结果,我不希望我多次获得同一家公司的结果。如何为此修改我的 Cypher 查询?我想要的是结果中的公司只能在结果的开头和结尾,而不是在中间圈出来。

【问题讨论】:

    标签: java neo4j cypher


    【解决方案1】:

    您可以尝试检查路径节点是否包含您的起始节点。

    start n=node(*) 
    match p=n-[:OWES*1..200]->(m), (m)-[r:OWES]->n 
    where HAS(n.taxnumber) 
    
    AND NOT(n IN tail(nodes(p)))
    
    return  extract(s in relationships(p) : s.amount) + r.amount, 
            extract(t in nodes(p) : ID(t)) + ID(n), 
            length(p) + 1;
    

    不幸的是,1.8.2 中没有下标,只有tail(coll) 没有简单的方法可以从检查中排除最后一个元素。这就是为什么我必须分解 p 并在最后修复您的聚合。

    【讨论】:

    • 当我运行它作为 start n=node(*) match p=n-[r:OWES*1..200]->n where HAS(n.taxnumber) AND NOT(n IN节点(p)[1..-1])返回提取(关系中的s(p):s.amount),提取(节点中的t(p):ID(t)),长度(p);我得到未闭合的括号错误...
    • 我在我的应用程序中使用 Neo4j-cypher-1.8.2.jar
    • 我升级到 2.0 运行查询 start n=node() match p=n-[r:OWES*1..200]->n where HAS(n.taxnumber) AND NOT(n IN 个节点(p)[1..-1]) 返回提取(s 在关系(p) 中:s.amount),提取(t 在节点(p):ID(t)),长度(p) ;并得到 Invalid input '(': 需要一个标识符字符、空格、NodeLabel、'.'、节点标签、'['、"=~"、IN、IS、''、'/'、'% ', '^', '+', '-', '', "=", '=', "", "!=", AND, XOR, OR, WHERE, '|', ')' 或 ','
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多