0

这是我第一次尝试 Neo4j,如果我遗漏了一些非常琐碎的东西,请原谅。这是我的问题:


考虑在以下 Neo4j 控制台示例中创建的图表: http ://console.neo4j.org/?id=y13kbv

在此示例中,我们有以下节点:

(人 {memberId,memberName,membershipDate})

(电子邮件 {value,badFlag})

(AccountNumber {value, badFlag})

我们可能有更多的节点来捕获与个人相关的特征,例如 creditCard、billAddress、shipAddress 等。所有这些节点都将与 Email 和 AccountNumber 节点相同: (creditCard {value, badFlag}), (billAddress {value, badFlag }),ETC。

在 Neo4j 控制台示例中填充了图表后,假设我们在图表中再添加一个 Person,如下所示:

(p7:Person {memberId:'18' , memberName:'John', membershipDate:'12/2/2015'}),
(email6:Email {value: 'john@gmail.com', badFlag:'false'}),
(a2)-[b13:BELONGS_TO]->(p7),
(email6)-[b14:BELONGS_TO]->(p7)

当我们将这个新人添加到系统时,用例是我们必须检查是否存在从新人的特征(“email6”和“a2”节点)到系统中任何其他节点的路径,其中“ badFlag=true",在本例中为节点 (a1 {value:1234, badFlag:true})。

在这里,结果路径将是(email6)-[BELONGS_TO]->(p7)<-[BELONGS_TO]-(a2)-[BELONGS_TO]->(p6)<-[BELONGS_TO]-(email5)-[BELONGS_TO]->(p5)<-[BELONGS_TO]-(a1:{badFlag:true})

我试过这样的事情:

MATCH (newEmail:Email{value:'john@gmail.com'})-[:BELONGS_TO]->(p7)-[*]-(badPerson)<-[:BELONGS_TO]-(badFeature{badFlag:'true'}) RETURN badPerson, badFeature;

当只有一级链接时,这似乎有效,但当路径可能更长时,如 Neo4j 控制台示例的情况,它不起作用。

我需要有关 Cypher 查询的帮助,这将帮助我解决这个问题。我最终将使用我的应用程序使用 Neo4j 的 Java API 执行此操作。使用 Java API 执行此操作的正确方法是什么?

4

1 回答 1

0

您的查询中有错字。PART_OF应该是BELONGS_TO。这应该适合你:

MATCH (newEmail:Email {value:'john@gmail.com'})-[:BELONGS_TO]->(p7)-[*]-(badPerson)<-[:BELONGS_TO]-(badFeature {badFlag:'true'})
RETURN badPerson, badFeature;

旁白:您似乎对所有属性都使用了字符串值。我会将字符串值 'true' 和 'false' 替换为布尔值truefalse. 同样,始终为数字的值应该只使用整数或浮点值。

于 2015-12-24T06:37:20.480 回答