Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配FOAF,但按日期约束路径;特别是在Neo4j中以顺序方式_Neo4j_Cypher_Foaf - Fatal编程技术网

匹配FOAF,但按日期约束路径;特别是在Neo4j中以顺序方式

匹配FOAF,但按日期约束路径;特别是在Neo4j中以顺序方式,neo4j,cypher,foaf,Neo4j,Cypher,Foaf,我正在用Neo4j进行“朋友的朋友”类型的匹配。唯一让我感到不快的是,我试图用日期来约束所有的关系 基本图表如下所示: 图的“真实”版本有10个一级好友和3385个二级好友 虽然我没有在上面图像的每一条边上都放置日期属性,但事实确实如此。任何日期都没有顺序 一般的想法非常简单:我希望确保忽略任何具有日期属性的关系,该属性早于预定的最大日期 稍微棘手的部分是,如果在第一个关系中违反了最大日期约束(如上图中节点的三条边中的一条),那么该边将被分成两半,并且该路径上不会发生其他遍历。(例如,我不想要

我正在用Neo4j进行“朋友的朋友”类型的匹配。唯一让我感到不快的是,我试图用日期来约束所有的关系

基本图表如下所示:

图的“真实”版本有10个一级好友和3385个二级好友

虽然我没有在上面图像的每一条边上都放置日期属性,但事实确实如此。任何日期都没有顺序

一般的想法非常简单:我希望确保忽略任何具有日期属性的关系,该属性早于预定的最大日期

稍微棘手的部分是,如果在第一个关系中违反了最大日期约束(如上图中节点的三条边中的一条),那么该边将被分成两半,并且该路径上不会发生其他遍历。(例如,我不想要任何叶节点)

我写道:

MATCH
(n)-[f1:FRIEND]-()-[f2:FRIEND]-(m)
WITH n, m,split('1962-1-1', '-') AS maxdate
WHERE n.person_id='180'
AND(
(
toInt(maxdate[0]) > toInt(split(f1.date, '-')[0])
)   
OR
(
toInt(maxdate[0]) = toInt(split(f1.date, '-')[0])
 AND
toInt(maxdate[1]) >= toInt(split(f1.date, '-')[1])
))
AND(
(
toInt(maxdate[0]) > toInt(split(f2.date, '-')[0])
)   
OR
(
toInt(maxdate[0]) = toInt(split(f2.date, '-')[0])
 AND
toInt(maxdate[1]) >= toInt(split(f2.date, '-')[1])
))
RETURN m;
这个代码块运行了大约20分钟,最终似乎产生了接近我目标的结果。以下是它在浏览器中的外观:

(它有350个节点)

首先,我承认这显然是一些写得很糟糕的代码(无论是从美学还是性能方面)。其次,我注意到周界上的未关联节点

我认为发生的是,当一级关系的约会条件失败,但二级关系没有,所以我最终得到了一个我不想被包括在内的“朋友的朋友”

如何修改日期条件,以便在一阶边无效时消除这些独立节点


如果有人有任何见解,我将不胜感激。(不必太激动,但多亏了SO社区,我已经走得相当快了,对此我很感激。)

首先,它不应该运行那么长时间,主要原因是您的节点上没有标签+索引

先加上这些:

CREATE CONSTRAINT ON (p:Person) ASSERT p.person_id is unique;
MATCH (n) where exists(n.person_id) SET n:Person;
如果您的时间在
yyyy-mm-dd
中(我希望至少是这样),您可以直接比较它们:(用两个数字aka
01
)即
'2012-01-10'>'2011-08-31'

您还可以使用
rels(path)

以“1962-01-01”作为最大日期
匹配路径=(n:Person{Person_id:'180'})-[:FRIEND*2]-(m:Person)
其中ALL(r在rels(path)中,其中r.date
或者,如果路径的关系相互关联:

WITH '1962-01-01' AS maxdate
MATCH (n:Person  {person_id:'180'})-[rels:FRIEND*2]-(m:Person)
WHERE ALL(idx in range(0, size(rels)-2) WHERE (rels[idx]).date < maxdate AND (rels[idx]).date < (rels[idx+1]).date)
RETURN m;
以“1962-01-01”作为最大日期
匹配(n:Person{Person_id:'180'})-[rels:FRIEND*2](m:Person)
其中所有(idx在范围(0,大小(rels)-2)中,其中(rels[idx]).date
我仍然在周边发现那些奇怪的、孤立的、断开连接的节点……需要进一步检查(突然我意识到现在是凌晨4:45!),这种情况经常发生:)(我的意思是)我修复了最后一个查询中的语法(缺少括号)这些查询在性能方面是否有排名?
WITH '1962-01-01' AS maxdate
MATCH (n:Person {person_id:'180'})-[rels:FRIEND*2]-(m:Person)
WHERE ALL(r in rels WHERE r.date < maxdate)
RETURN m;
WITH '1962-01-01' AS maxdate
MATCH path = (n:Person {person_id:'180'})-[:FRIEND*2]-(m:Person)
WHERE ALL(r in rels(path) WHERE r.date < maxdate)
RETURN m;
WITH '1962-01-01' AS maxdate
MATCH (n:Person  {person_id:'180'})-[rels:FRIEND*2]-(m:Person)
WHERE ALL(idx in range(0, size(rels)-2) WHERE (rels[idx]).date < maxdate AND (rels[idx]).date < (rels[idx+1]).date)
RETURN m;