نتيجة استعلام تشفير neo4j غير متوقعة
سؤال
أرغب في تحديد النسبة المئوية لمدة المحادثة مع الجيران الذين يعرفون شخصًا معينًا.
على سبيل المثال، عند مراقبة العقدة A أولاً علينا معرفة مقدار الوقت الذي قضاه في التحدث مع جميع جيرانه والذي يتم تنفيذه بالاستعلام التالي:
neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 12418 |
==> +-----------------+
==> 1 row, 0 ms
بعد ذلك علينا التحقق من أي من جيرانه يعرف شخصًا معينًا (على سبيل المثال ج) ونجمع فقط فترات المحادثات بين أ و ب حيث يعرف ب ج:
neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 21013 |
==> +-----------------+
==> 1 row, 0 ms
ما لا يبدو منطقيًا هنا هو أن المجموع الثاني أكبر من الأول بينما من المفترض أن يكون الثاني مجرد جزء من الأول.هل يعرف أحد ما يمكن أن يكون مشكلة للحصول على مثل هذه النتيجة؟الخطأ ظهر على 7 مستخدمين من أصل 15000.
المحلول
أنت لا تنظر إلى شخص معين C في هذا الاستعلام.أنت تقوم بمطابقة جميع المسارات لأي علاقة KNOWS، لذا إذا كان لديك a->b->c وa->b->d، فسيتم حساب المدة بين a->b مرتين.
ما ربما عليك القيام به هو هذا بدلاً من ذلك:
start a = node(351061), c=node(xxxxx) // set c explicitly
match (a)-[r:TALKED_TO]->(b)
where b-[:KNOWS]->c // putting this in the where clause forces you to set C
return sum(r.duration)
إليك مثال في وحدة التحكم:http://console.neo4j.org/r/irm0zy
تذكر ذلك match
يوسع و where
يشدد النتائج.يمكنك أيضًا القيام بذلك باستخدام match
, ، ولكن عليك تحديد c في start
.
إحدى الطرق الجيدة لاختبار ما تفعله وظائفك المجمعة هي إرجاع كافة المتغيرات المسماة (أو تعيين مسار يمكنك إرجاعه) - وبهذه الطريقة ترى التجميع مفصولاً إلى إجماليات فرعية.مثل ذلك:
start a=node(1)
match a-[r:TALKED_TO]->b-[:KNOWS]->c
return sum(r.duration), a,b,c;
+-----------------------------------------------------------------------------------------------+
| sum(r.duration) | a | b | c |
+-----------------------------------------------------------------------------------------------+
| 20 | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} |
| 20 | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} |
| 20 | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} |
+-----------------------------------------------------------------------------------------------+