如何在Neo4J Java中搜索一个关系中的endNodes,而不是另一个关系中的endNodes

时间:2016-12-10 20:53:27

标签: java neo4j

我有一个用户的初始节点,可以拥有多个项目,并且这些项目也可以组织成组(每个组分为多个组)。因此,用户可以具有两个对应的关系 - 拥有该组并拥有该项。这些项目与群组有额外的关系。

我想找到用户拥有的项目,但不是任何组。

有没有办法如何在一个遍历方法中选择这些项目,或者我应该获取用户拥有的所有项目,然后迭代它们以找出这些项目而没有与组的关系? < / p>

修改:很抱歉,我的问题不够明确。通过遍历方法我的意思是在Java中使用Neo4j Traversal Framework。例如:

TraversalDescription td = db.traversalDescription()
    .breadthFirst()
    .relationships(OWNS, Direction.BOTH)
     //IS THERE A WAY HOW TO SAY THE NEXT RELATIONSHIP (EDGE) DOES NOT EXIST?
    .evaluator(Evaluators.excludeStartPosition())
    .uniqueness(Uniqueness.NODE_GLOBAL);

Traverser t = td.traverse(userNode);
    for (Path p : t) {
        //OR: SHOULD I LOOP TROUGH ALL THE RELATIONSHIPS OF THE END NODE - ITEM
        System.out.println(p.endNode().getProperty("name"));
    }

代码中的两条注释是我期望traversalDescription的方法或迭代endNodes的所有关系的地方。

1 个答案:

答案 0 :(得分:1)

在Cypher:

MATCH (me:Person{name:'me'})-[:OWNS]->(i:Item)
WHERE NOT (i)-[:PART_OF]->()  // not part of a group
RETURN i

在Java API中:

Node me = graphDb.findNode(Label.label("Person"), "name", "me");
Iterable<Relationship> owns = me.getRelationships(RelationshipType.withName("OWNS"), Direction.OUTGOING);
Stream<Node> nodes= StreamSupport.stream(owns.spliterator, false)
    .filter(r -> r.getEndNode().hasRelationship(RelationshipType.withName("PART_OF"),OUTGOING))
    .map(r -> r.getEndNode());