我对Neo4j完全陌生。我正在测试图形数据库,我有以下简单的图形测试结构:different labeled nodes with properties, which are connected。
所有节点都有一个属性,称为访问。它是一个字符串元素列表,例如:
{access: ['http', 'www']}
我正在寻找一个解决方案,我从一个起始节点获取所有节点,这些节点是连接的(无论哪种类型或方向),以及它们之间存在节点访问属性交集的关系。我将从给定节点开始,并将访问属性与下一个连接节点进行比较。然后,获取第二个节点的属性,并将此访问属性与连接到它们的节点进行比较。等等。目标应该是所有节点及其连接,其中存在访问属性的部分。例如,在图的具体结构上,我们从节点 ENC 2009 开始,并且应该遍历所有连接的节点,直到达到访问属性上没有交集的节点。对于此示例,应达到以下目标:traversed graph
我尝试了以下cypher查询,但它在每个节点上都没有正常工作作为起始节点。
MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*'
MATCH p = n-[*]-m WHERE FILTER(x IN n.access WHERE x IN m.access)
RETURN p
是否有一个解决方案,使用java遍历框架或使用cypher来实现目标并获取此类图形的路径?
提前感谢您的帮助。
答案 0 :(得分:1)
java遍历框架在这方面会更有效率,你可以使用RelationshipExpander中当前Path的关系
http://neo4j.com/docs/stable/tutorial-traversal-java-api.html#_pathexpander_relationshipexpander
在密码中,您可以执行以下操作:
MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*'
MATCH p = n-[*]-m
WHERE FILTER(idx IN range(0,length(p)-2)
WHERE ANY(access IN (rels(p)[idx]).access
WHERE access IN (rels(p)[idx+1]).access))
RETURN p
即。有一个计数器从0到path-len-2 查看路径的每对rel,并检查下一个rel的access-property中是否包含至少一个(ANY)访问代码。
答案 1 :(得分:1)
好的,我找到了一个适合我的解决方案。 @MichaelHunger,谢谢你的提示。我希望我的同事使用图表信息也没问题。我们明天会看到它。
仅供参考:在traversalDescription中,我创建了一个Evaluator。我从路径中获取了最后一个关系,并从起始节点和结束节点获取属性访问权限。现在我可以比较两个属性之间是否存在交集。如果是这样,我将节点包含在结果中并继续。如果不是,请排除节点并停止遍历。 它有效,我希望它是一个有效的解决方案。
源代码如下:
TraversalDescription traversal = db.traversalDescription().depthFirst().evaluator(new Evaluator() {
@Override
public Evaluation evaluate(Path path) {
// TODO Auto-generated method stub
if (path.length() != 0) {
String[] startAccess = (String[]) path.lastRelationship().getStartNode().getProperty("access");
String[] endAccess = (String[]) path.lastRelationship().getEndNode().getProperty("access");
if (checkInteresection(startAccess, endAccess)) {
return Evaluation.INCLUDE_AND_CONTINUE;
} else {
return Evaluation.EXCLUDE_AND_PRUNE;
}
}
return Evaluation.INCLUDE_AND_CONTINUE;
}